【问题标题】:Component outside of router-outlet, does not have its window.location.href updated after router redirect via guard?路由器出口之外的组件,在路由器通过保护重定向后没有更新其 window.location.href?
【发布时间】:2020-04-21 12:34:06
【问题描述】:

我有一个位于路由器外部的导航组件,它使用一个可重用的图标组件,该组件依赖于绝对 url 指向 SVG 图标,该图标是通过组件内的 getter 检索的:

public get absUrl(): string {
    return window.location.href.split('#')[0];
  }

不幸的是,当从守卫触发时,重定向视图不会使用新的 abs url 更新。

我已经用 setTimeout 做了一个解决方法,但它超级 hacky - 它纯粹是为了证明最终导致问题的链中存在一些延迟,window.location.href 的值是正确的。

解决方法如下:

public absUrl = window.location.href.split('#')[0];

  ngAfterViewInit() {
    setTimeout(() => {
      this.absUrl = window.location.href.split('#')[0];
      this.ref.detectChanges();
    }, 200);
  }
  • 仅当在受保护的路径上加载整个应用程序时,在加载应用程序后尝试随后访问受保护的路径才能正常工作。
  • 当以不存在的路径加载整个应用程序并被重定向到 /404 时会发生这种情况
  • 如果我设置 0 - 100ms 超时,它不会及时更新
  • 通过router-outlet加载的组件正常工作,图标内的abs url更新准确。

有人对如何正确实施这个有任何想法吗?我的直觉是,如果您尝试加载受保护的路线,这与应用程序第一次加载的方式有关。

【问题讨论】:

  • 为什么不能使用router.url属性?
  • @PierreDuc router.url 将比仅仅使用 window.location.href 更落后,即使在 window.location.href 工作的情况下,它也不会有更新的值来工作跨度>

标签: angular angular-router angular-changedetection virtual-dom


【解决方案1】:

我想你可以使用Location 服务来做这样的事情:

public absUrl = window.location.href.split('#')[0];

constructor(location: Location, ref: ChangeDetectorRef) {
  location.onUrlChange((s) => {
    this.absUrl = window.location.href.split('#')[0]);
    ref.detectChanges();
  });
}

【讨论】:

  • 你的意思是 this.absUrl = window.location ...等等?这本身不起作用,但如果我在那之后立即运行更改检测周期,它似乎更一致地工作。我将在没有 setTimeout 的情况下重新测试我的所有用例,以确保这适用并密切关注变更检测周期。不过,它应该比直接吸气剂更有效。谢谢!
  • @SebastianG 我已经更新了我的答案。我想我有点太仓促了 :) 无论如何,如果您想阻止使用更改检测器 ref,并且您只是在模板中使用 absUrl,您可以考虑使用 Observable 结合 @987654326 @管道
  • 使用异步管道仍将运行更改检测周期,这与调用 ref.detectChanges 无关,只是更注重性能,无论如何,您的解决方案将比使用重新计算的 getter 性能更高每个更改检测周期与您对位置的订阅。它在我所有的用例中都很好用,所有的 setTimeouts 都被删除了。我现在将其标记为正确的解决方案。你也可以把这个贴到我几个月前问过的关于几乎同一件事的问题上吗?
  • @SebastianG 如果应该尝试将所有组件设置为OnPush,这将极大地提升性能。是的,我知道async 确实会触发它自己的更改检测,但它是由 Angular 管理的,所以你不必担心它,或者弄乱你的代码:)
  • 多年来一直这样做,但谢谢,这是个好建议,顺便说一句,这是我上面提到的另一个线程:stackoverflow.com/questions/60580253/…
猜你喜欢
  • 2021-12-16
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2019-12-25
相关资源
最近更新 更多