角度路由器 - 当辅助路由也打开时,isActive()是否应标识主路由?

时间:2017-04-27 03:07:47

标签: angular angular-routing

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

router.isActive是否适合检查我是否在路线(x)上?' (例如:付款页面) - 无论哈希状态如何,查询参数和次要路线

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

E.g:

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

我已经创建了plnkr proof of concept,以便于测试:

enter image description here

1 个答案:

答案 0 :(得分:3)

在这里看一下来源:

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比较是使用&#39;泛型&#39;来完成的。浅比较算法,以确定准确性。这让我认为当前的isActive()方法不够健壮(或者有意设计的方式),无法在您需要的粒度级别进行确定。

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

可能值得与Angular家伙讨论,看看是否有办法可以获取信息。