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概念证明,以便于测试:
看看这里的来源:
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 人员讨论一下,看看是否有办法可以获取这些信息。
| 归档时间: |
|
| 查看次数: |
4427 次 |
| 最近记录: |