我发现只要次要路线打开,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,以便于测试:
答案 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家伙讨论,看看是否有办法可以获取信息。