Angular router - isActive() 是否应该识别主路由,当辅助路由也打开时?

Angular router - Should isActive() identify the main route, when a secondary routes is also open?

我发现 router.isActive 正在 returning false 任何时候第二条路线是开放的。

router.isActive是否适合检查'am I on route (x)?'(例如:支付页面)——不管哈希状态、查询参数和二级路由.

router.isActive 应该是正确的 service/call 来推断这个吗?或者它是为了更简单的东西而设计的。有其他选择吗?应该写我自己的服务吗?

例如:

我创建了一个 plnkr proof of concept,以便于测试:

在这里查看源代码:

https://github.com/angular/angular/blob/master/packages/router/src/router.ts#L493

所以你指定一个urlTree或者一个字符串,是否需要精确匹配。

让我们看看它之后做了什么。

return containsTree(this.currentUrlTree, urlTree, exact);

所以让我们看看 containsTree

https://github.com/angular/angular/blob/master/packages/router/src/url_tree.ts#L16

看起来它根据 exact.

的值对树进行了精确比较。

更多的调查将我们引向这里:

export function shallowEqual(a: {[x: string]: any}, b: {[x: string]: any}): boolean {
  const k1 = Object.keys(a);
  const k2 = Object.keys(b);
  if (k1.length != k2.length) {
    return false;
  }
  let key: string;
  for (let i = 0; i < k1.length; i++) {
    key = k1[i];
    if (a[key] !== b[key]) {
      return false;
    }
  }


 return true;
}

所以看起来 urlTree 比较是使用 'generic' 浅层比较算法来确定准确性的。这让我认为当前的 isActive() 方法不够健壮(或者是故意这样设计的),无法在您需要的粒度级别进行确定。

我不确定是否有更好的方法(除了可能自己解析之外),或者这是否是 isActive() 方法的目的。我猜 isActive() 方法(使用精确性时)可能是这样写的,因为术语 exact 意味着即使有辅助路由也不会产生完全匹配。

可能值得与 Angular 的人讨论一下,看看是否有办法获取该信息。