gpt4 book ai didi

Angular router - 当辅助路由也打开时,isActive() 是否应该识别主路由?

转载 作者:太空狗 更新时间:2023-10-29 17:01:36 25 4
gpt4 key购买 nike

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

router.isActive 适合检查“我在路线 (x) 上吗?”(例如:支付页面)——不管哈希状态、查询参数如何和次要路线

router.isActive 应该是正确的服务/调用来推断这一点吗?或者它是为了更简单的东西而设计的。有其他选择吗?应该编写我自己的服务吗?

例如:

  • 当在 /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

最佳答案

在这里查看源代码:

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

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

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

关于Angular router - 当辅助路由也打开时,isActive() 是否应该识别主路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43647979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com