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 来推断这个吗?或者它是为了更简单的东西而设计的。有其他选择吗?应该写我自己的服务吗?
例如:
- 启用
/second
、router.isActive('second', true)
=== true
- (好)
- 启用
second(modal:my-modal)
、router.isActive('second', true)
=== false
- 问题:此功能现在不再用于确定我是否在第二页面
- 启用
/second
时,router.isActive('', false)
=== 为真。 (不完全匹配 return true parent/child states
我创建了一个 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 的人讨论一下,看看是否有办法获取该信息。
我发现 router.isActive
正在 returning false
任何时候第二条路线是开放的。
router.isActive
是否适合检查'am I on route (x)?'(例如:支付页面)——不管哈希状态、查询参数和二级路由.
router.isActive
应该是正确的 service/call 来推断这个吗?或者它是为了更简单的东西而设计的。有其他选择吗?应该写我自己的服务吗?
例如:
- 启用
/second
、router.isActive('second', true)
=== true- (好)
- 启用
second(modal:my-modal)
、router.isActive('second', true)
=== false- 问题:此功能现在不再用于确定我是否在第二页面
- 启用
/second
时,router.isActive('', false)
=== 为真。 (不完全匹配 return true parent/child states
我创建了一个 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 的人讨论一下,看看是否有办法获取该信息。