angular UrlMatcher不再接收重定向后的完整URL SegmentGroup,

n1bvdmb6  于 6个月前  发布在  Angular
关注(0)|答案(2)|浏览(59)

哪个@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

还有其他信息吗?

  • 无响应*
368yc8dk

368yc8dk1#

在v15中,实际上会导致apply_redirectsrecognize阶段中的不同匹配。当匹配器第一次以"broken"行为在apply_redirects阶段运行时,它看到的是UrlSegmentGroup没有段落。当稍后在recognize阶段运行时,它看到一个不同的段落组,因为空的段落已经合并到父级中。
两个阶段中的不同匹配肯定不是有意为之。现在可能存在/已经存在一个问题,即在apply_redirects阶段中,用于在重定向后进行匹配的UrlSegmentGroup应该更好地反映当前段落的状态。需要进行一些调查来确定是否可能。例如,段落是否应该以某种方式立即应用于这里的组:
angular/packages/router/src/recognize.ts
第380行至第381行的59fc4de
| | segmentGroup, |
| | newSegments.concat(remainingSegments), |
(这可能不够充分,因为段落组还没有链接到父级组,所以还需要进行更多的更改)。
顺便说一下,感谢您的深入调查和重现!

qyuhtwio

qyuhtwio2#

我想补充一个例子来说明为什么v15版本也是有问题的:https://stackblitz.com/edit/stackblitz-starters-j1h99g?file=src%2Fapp%2Fapp.routing.module.ts,src%2Fapp%2Fmatcher.ts
由于apply_redirects步骤与匹配器不兼容,第二个重定向没有被应用。尽管在后面的recognize步骤中它“起作用”,因为它可以访问整个UrlSegmentGroup,但在那时重定向被禁用,实际上它只是在该路由上着陆/稳定/匹配,而没有执行重定向。

相关问题