将全局 NavigationExtras 添加到路由器的每个导航操作

fri*_*doo 5 angular angular-router

是否可以向NavigationExtras路由器提供全局?

skipLocationChange每当我导航到我的应用程序中的不同页面时,我都必须使用。我目前在模板中添加此选项:

<a routerLink="settings" skipLocationChange>Settings</a>
Run Code Online (Sandbox Code Playgroud)

或在组件中:

this.router.navigate(['settings'], { skipLocationChange: true });
Run Code Online (Sandbox Code Playgroud)

我能否以某种方式定义由 AngularNavigationExtras自动添加到所有navigate操作的全局默认值,以便我不必手动将它们添加到模板中的每个链接或router.navigate(..)组件中的每个调用?

max*_*992 0

过去一个小时我一直在与这个问题作斗争。实际上,我正在开发的网络应用程序是从非常规浏览器(基于 QT)作为加载项启动的。

由于某种原因,一旦使用位置历史记录,应用程序的某些部分就会停止工作(没有任何错误)。

我通过向我的路由器链接之一添加“skipLocationChange”来仔细检查它是否工作正常,并且它工作正常。但我不可能在整个应用程序中执行此操作,并且仅忘记其中一个就会默默地破坏该应用程序,因此风险太大。

我首先想到的是扩展路由器并重写navigate方法来强制通过skipLocationChange: true。但这又太冒险了......还有其他方法无法通过该方法(一个例子是navigateByUrl.

所以我想为什么不完全关闭整个历史(至少任何写作)。我深入研究了 Angular 源代码,发现修改浏览器位置历史记录的PushStateLocationStrategy. 因此,为了完全关闭对历史记录的写入,我们唯一要做的就是定义一个扩展一个策略的类(可以是 或PathLocationStrategyHashLocationStrategy并覆盖该pushState方法以使其保持为空:

class PathLocationStrategyWithoutHistoryState extends PathLocationStrategy { 
  override pushState( ): void {}
}
Run Code Online (Sandbox Code Playgroud)

然后在应用程序顶部的提供者数组中注入它:

providers: [
  {
    provide: LocationStrategy,
    useClass: PathLocationStrategyWithoutHistoryState
  }
],
Run Code Online (Sandbox Code Playgroud)