如何从 Angular 应用程序范围之外更改 Angular 中的路由?

2024-01-30

我的问题标题可能有点令人困惑,所以希望以下详细信息能够澄清它。
本质上,导航栏是我无法控制的,它是用简单的 HTML/JS 编写的。我的应用程序是用 Angular 编写的,并在其中设置了路由。

我可以做些什么来从导航栏触发 Angular 应用程序中的路由吗?

假设我在index.html中有以下内容:

<body>
    <header>
        <a onclick="history.pushState({}, '', '/home');">Home</a>
        <a onclick="history.pushState({}, '', '/test');">Test</a>
    </header>
    <app-root></app-root>
</body>

显然,我的 Angular 应用程序从<app-root>并且不知道它上面的标签。然而,有没有办法从外部影响 Angular 内部的路由呢?

我认为调用history.pushState()会改变它,但它似乎没有做任何事情。它确实改变了 URL,但浏览器上显示的组件保持不变。它不会切换组件。

有人有解决这个问题的办法吗?
我真的很感谢你的帮助!


如果有人正在寻找潜在的解决方案,这是我在另一个论坛上推荐的解决方案。也许有更好的方法来做到这一点并对其进行改进,但到目前为止,这是我所拥有的:

在 app.component.ts 中(或者任何你想要处理路由的地方):

declare var window: any;

//@Component stuff...
export class AppComponent implements OnInit, OnDestroy {

    routerSubject: Subject<string> = new Subject<string>();

    constructor(private router: Router) {
        // Assign the observable to the window object, so that we can call it from outside
        window.routerSubject = this.routerSubject;
    }

    ngOnInit() {
        this.routerSubject.subscribe((url: string) => {
            // Programmatically navigate whenever a new url gets emitted.
            this.router.navigate([`/${url}`]);
        });
    }

    ngOnDestroy() {
        this.routerSubject.unsubscribe();
    }
}

现在,在index.html中:

<body>
    <header>
        <!-- Emit a new value on click, so that Angular (which has already been subscribed) can programmatically route -->
        <a onclick="window.routerSubject.next('home');">Home</a>
        <a onclick="window.routerSubject.next('about');">About</a>
    </header>
    <app-root></app-root>
</body>

显然,您可以将 onclick 方法放在单独的 JS 文件中,并将 Angular 路由逻辑放在服务中,等等。但这就是我提出的解决方案的一般要点。

无论哪种方式,这都应该使人们能够从外部路由 Angular 应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Angular 应用程序范围之外更改 Angular 中的路由? 的相关文章

随机推荐

  • 从另一张 iOS 中减去一张图像

    任何人都知道如何从另一个 UIImage 中减去一个 UIImage 例如这个屏幕 感谢您的回复 我相信您可以通过使用来完成此任务kCGBlendModeDestinationOut混合模式 创建一个新的上下文 绘制背景图像 然后使用此混合
  • 验证 WPF 组合框中选定的值

    就像标题所说 我正在尝试验证我的表单 但在获取组合框值时遇到问题
  • Spark DataFrame 分区器为 None

    Spark新手 创建 DataFrame 后 我尝试根据 DataFrame 中的列对其进行分区 当我使用检查分区器时data frame rdd partitioner I get None作为输出 分区使用 gt data frame
  • 在 MySQL 服务器或 PHP 中更快地随机化许多结果

    在 MySQL 服务器上随机化大量结果的排序顺序更快还是在 PHP 中收到数据后更快 有谁有任何数据可以备份 甚至是轶事经验吗 我有根据的猜测是 MySQL 毫无疑问会获胜 它就是为了以这种方式处理数据而设计的 必须将所有数据移至 PHP
  • C 中字符串中所有可能的组合

    我正在尝试使用 C 打印字符串 abc 的所有可能组合 有人可以帮助指出我在这段代码中哪里出错了吗 我正在使用这里提到的算法 http hackercs com videos Combinations of a String Part 2
  • 如何编写带有子查询作为 WHERE 子句一部分的 Django 查询?

    我正在使用 Django 和 Python 3 7 我无法弄清楚如何编写 Django 查询 其中子查询作为 where 子句的一部分 这是模型 class Article models Model objects ArticleManag
  • JQuery 文档就绪 - 允许多个吗? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery 拥有多个 document ready function 是否不好 https stackoverflow com questions 1148241 jquery is it bad
  • 我如何得到,用户在 facebook sdk 4.0.1 中登录或注销

    我正在使用 Facebook 新的 sdk 4 0 1 因为当我登录按钮更改为注销时 相同的按钮用于注销 无需任何代码 但实际上我想在注销时进行一些编码 那么我如何区分该 SDK 中的这两件事呢 我如何声明注销方法 您可以检查令牌何时更改
  • JavaScript 警报后页面重新加载/刷新 - 不希望这样做!

    我的 JavaScript 函数正在工作 但由于某种原因 在我的 IF 语句中显示警报后 页面重新加载 刷新 但我不希望它这样做 这是为什么 我怎样才能改变我的功能 使它不会这样做 我的功能 function valSubmit varNa
  • 为什么内联未命名命名空间?

    专家快速介绍 C 11 允许声明未命名的命名空间inline 这对我来说似乎是多余的 在未命名命名空间中声明的内容已经被使用 就像它们在封闭命名空间中声明一样 所以我的问题是 这是什么意思 inline namespace anonymou
  • 无需 APNS 从服务器到 iOS 设备的实时数据推送 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否可以在操作中从 view.yml 获取值

    我想知道是否可以在操作中从 view yml 获取样式表的名称 最好使用像以下这样简单的东西 sfConfig get 我想访问 view yml 中的现有声明 而不是对其进行硬编码或将其复制到 app yml 之类的地方 Thanks 如
  • iOS8 中的扩展 - 由于没有系统应用程序而终止

    尝试运行我的 iOS 小部件 它是 Today 扩展 每次我尝试将其添加到通知中心时 我不断收到消息 由于没有系统应用程序而终止 有想法该怎么解决这个吗 我正在尝试制作一个包含表格视图的扩展 在您的项目设置中查找显示 启动屏幕文件 的设置
  • “mvn cleangenerate-sources”无法解决依赖关系

    there 我遇到了一个奇怪的问题 我有一个用 Maven 构建的多模块企业项目 我像这样设置项目层次结构 parentPom MyEar packaging ear MyUtilJar packaging jar MyEJB packin
  • 新安装时,curl 和 wget 对于 helloworld.php 返回错误 500,但浏览器正常

    我没有 htaccess 文件 我有index php 它包含以下内容 并且在 Chrome 或 Safari 等浏览器中运行良好 当我将其加载到浏览器中时 我得到 你好世界 当我尝试以下任何操作时 我收到错误 500 内部服务器错误 us
  • window.onresize 不在 Chrome 中触发,但在 Chrome Incognito 中触发

    我想问一下 在什么情况下可以这样呢 我有一个网站window onresize事件 适用于 Firefox IE9 Chrome 隐身窗口 但不适用于 Chrome 问题是 在我对代码进行一些不相关的更改之前 或者在我昨天更新 chrome
  • 在 Swift 中从类创建 JSON 对象

    我对 iOS 开发和 Swift 还很陌生 所以请耐心等待 我有一个类对象定义如下 class LocationPoint var x Double var y Double var orientation Double init x Do
  • 如何在 App store connect 中批准新版本

    如何在 App store connect 中批准新版本 我的意思是 我已经在苹果商店上提供了该移动应用程序的第一个版本 但现在我想发布一个新版本 我已经做的是通过 Xcode gt archive 上传它 然后在 appstoreconn
  • 如何在erlang中连接列表而不创建嵌套列表?

    我正在努力成为一名优秀的管理者并避免使用 我需要将一个元组添加到列表的末尾 而不创建嵌套列表 并且希望不必向后构建它并反转它 给定元组 T 和列表 L0 和 L1 当我使用 T L0 I get 元组 列表0 但是当我使用 L0 T 我得到
  • 如何从 Angular 应用程序范围之外更改 Angular 中的路由?

    我的问题标题可能有点令人困惑 所以希望以下详细信息能够澄清它 本质上 导航栏是我无法控制的 它是用简单的 HTML JS 编写的 我的应用程序是用 Angular 编写的 并在其中设置了路由 我可以做些什么来从导航栏触发 Angular 应