哪个@angular/*包是bug的来源?
router
这是回归吗?
是的
描述
在Angular 15中,UrlMatcher函数在重定向后接收到完整的SegmentGroup,这使得它们可以处理之前被消耗掉的段。这对于依赖于参数特定值的情况很有帮助。
在Angular 16中,在重定向后,UrlMatcher接收到一个没有段的SegmentGroup。
我认为这是因为在Angular 15中,路由器有一个名为"applyRedirects"的步骤,它会与路由进行匹配以确定是否应该发生重定向,然后"recognize"接收到一个带有完整"urlAfterRedirects"的参数。
在这个提交中,这个步骤被移除了:3c7e63737407287986c65136efd1f53d1215a53e
我认为这是解决这个问题的一部分:issue
这个问题提到:"这也是一个破坏性的变化,因为它可能导致应用程序中的新(但正确的)路由行为",所以我认为v15的行为可能是"错误的",而当前的行为现在被认为是"正确的"。
然而,我个人认为UrlMatchers的新行为确实限制了它们的使用方式,而且除此之外,还使它们在重定向导航和标准导航之间的行为不一致。对于标准导航,它们仍然接收到完整的SegmentGroup,而对于重定向导航,它们接收到一个空的SegmentGroup。
我尽力提供了一个最小复现问题的链接:v15
v16
v18
请提供一个链接到最小复现bug的问题
https://stackblitz.com/edit/stackblitz-starters-ux4qvj
请提供您看到的异常或错误
In the v15 example I provided, the links "To Container With Match" and "To A With Match" work the same and match the child route with the UrlMatcher. "To Container With Match" is a redirect navigation and "To A With Match" is a direct navigation.
In the v16 and v18 examples, "To Container With Match" is "broken" and does not match the child route with the UrlMatcher.
请提供您发现此bug的环境(运行ng version
)
Angular CLI: 16.2.14
Node: 18.20.3
Package Manager: npm 10.2.3
OS: linux x64
Angular: 16.2.12
... animations, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1602.14
@angular-devkit/build-angular 16.2.14
@angular-devkit/core 16.2.14
@angular-devkit/schematics 16.2.14
@angular/cli 16.2.14
@schematics/angular 16.2.14
rxjs 7.8.1
typescript 5.1.6
zone.js 0.13.3
through
Angular CLI: 18.1.0
Node: 18.20.3
Package Manager: npm 10.2.3
OS: linux x64
Angular: 18.1.0
... animations, cli, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1801.0
@angular-devkit/build-angular 18.1.0
@angular-devkit/core 18.1.0
@angular-devkit/schematics 18.1.0
@schematics/angular 18.1.0
rxjs 7.8.1
typescript 5.4.5
zone.js 0.14.7
还有其他信息吗?
- 无响应*
2条答案
按热度按时间368yc8dk1#
在v15中,实际上会导致
apply_redirects
和recognize
阶段中的不同匹配。当匹配器第一次以"broken"行为在apply_redirects
阶段运行时,它看到的是UrlSegmentGroup
没有段落。当稍后在recognize
阶段运行时,它看到一个不同的段落组,因为空的段落已经合并到父级中。两个阶段中的不同匹配肯定不是有意为之。现在可能存在/已经存在一个问题,即在
apply_redirects
阶段中,用于在重定向后进行匹配的UrlSegmentGroup
应该更好地反映当前段落的状态。需要进行一些调查来确定是否可能。例如,段落是否应该以某种方式立即应用于这里的组:angular/packages/router/src/recognize.ts
第380行至第381行的59fc4de
| | segmentGroup, |
| | newSegments.concat(remainingSegments), |
(这可能不够充分,因为段落组还没有链接到父级组,所以还需要进行更多的更改)。
顺便说一下,感谢您的深入调查和重现!
qyuhtwio2#
我想补充一个例子来说明为什么v15版本也是有问题的:https://stackblitz.com/edit/stackblitz-starters-j1h99g?file=src%2Fapp%2Fapp.routing.module.ts,src%2Fapp%2Fmatcher.ts
由于
apply_redirects
步骤与匹配器不兼容,第二个重定向没有被应用。尽管在后面的recognize
步骤中它“起作用”,因为它可以访问整个UrlSegmentGroup
,但在那时重定向被禁用,实际上它只是在该路由上着陆/稳定/匹配,而没有执行重定向。