角度路由器 - 当辅助路由也打开时,isActive()应该识别主路由吗?

Ove*_*lew 13 angular-routing angular

我发现只要次要路线开放,它router.isActive就会返回false.

router.isActive适用于检查"是我的路线(X)?" (例如:付款页面) - 无论是hashstates,查询参数和辅助路由.

应该router.isActive是正确的服务/电话来推断这个?或者它是为了更简单的事情.还有其他选择吗?应该写我自己的服务?

例如:

  • 打开时/second,router.isActive('second', true)=== true
    • (好)
  • 打开时second(modal:my-modal),router.isActive('second', true)=== false
    • 问题:此功能现在不再有用,以确定我是否在第二
  • 打开时/second,router.isActive('', false)=== true.(非完全匹配返回真正的父/子状态

我已经创建了一个plnkr概念证明,以便于测试:

在此输入图像描述

chr*_*spy 5

看看这里的来源:

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

看起来它根据 a 的值与树进行了精确比较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;
}
Run Code Online (Sandbox Code Playgroud)

因此,看起来比较urlTree是使用“通用”浅层比较算法来确定准确性的。这让我认为当前isActive()方法不够强大(或者是故意这样设计的),无法按照您需要的粒度级别做出决定。

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

可能值得与 Angular 人员讨论一下,看看是否有办法可以获取这些信息。