Javascript 将:id添加到受保护的组件路径会导致无限循环吗?

Javascript 将:id添加到受保护的组件路径会导致无限循环吗?,javascript,angular,typescript,Javascript,Angular,Typescript,因为:id path变量位于到受保护HelloComponent的路由中 如果:id被删除,则会呈现登录视图,因为这两条路径都将受到保护,但是如果:id变量被添加回路径,则演示将永远旋转 这是一个bug还是我在这个位置添加了:id违反了路由器的一些原则 请注意,我将ViewBook组件替换为HelloComponent只是为了解决问题。books模块是惰性的,其工作方式是,如果用户在搜索中验证并选择一本书,则可以使用路径books/45342显示该书,这将触发:id路径,但如果仅请求books,

因为:id path变量位于到受保护HelloComponent的路由中

如果:id被删除,则会呈现登录视图,因为这两条路径都将受到保护,但是如果:id变量被添加回路径,则演示将永远旋转

这是一个bug还是我在这个位置添加了:id违反了路由器的一些原则

请注意,我将ViewBook组件替换为HelloComponent只是为了解决问题。books模块是惰性的,其工作方式是,如果用户在搜索中验证并选择一本书,则可以使用路径books/45342显示该书,这将触发:id路径,但如果仅请求books,而没有路径参数,则显示该书集

。Is使用基本相同的路由配置

。在旧版本中,顺序似乎无关紧要,但现在它确实如此


试试这个,注意我改变了顺序,把pathMatch添加到了路由中

如果问题没有解决,请让我知道删除我的答案
使用路由器时,必须小心导入模块的位置。理想情况下,您不会在应用程序的任何地方导入延迟加载的模块

在您的情况下,您正在将book模块导入到应用程序模块中。这会将路由添加到根级别的路由器配置中。路由器确实喜欢用延迟加载的模块处理未知的事情。无法激活的路由不会添加到配置中

从应用程序模块中删除书本模块后,请参见新配置:

0: {path: "login", component: ƒ}
1: {path: "", redirectTo: "books", pathMatch: "full"}
2: {path: "books", loadChildren: ƒ, _loadedConfig: LoadedRouterConfig}
3: {path: "**", component: ƒ}
搬家前的VS:

0: {path: ":id", component: ƒ}
1: {path: "", component: ƒ}
2: {path: "login", component: ƒ}
3: {path: "", redirectTo: "books", pathMatch: "full"}
4: {path: "books", loadChildren: ƒ, _loadedConfig: LoadedRouterConfig}
5: {path: "**", component: ƒ}

解决方法:只需不在应用程序模块中导入书本模块。在您的情况下,您需要在book模块中导入HttpClientModule。

IIUC更具体的路径应该是第一个。例如,如果我们添加find,那么它将出现在:id之前。在本例中,首先触发空路径,现在:id路径将永远不会触发。评论员让我知道我是否错了,我可以接受答案。它试图重构这个演示:在其中:id路径位于路径之前。文档中也这样说:配置中的路由顺序很重要,这是由设计决定的。路由器在匹配路由时使用第一次匹配获胜策略,因此更具体的路由应该放在不太具体的路由之上。我认为angular的一些核心语义自演示发布以来已经被重构,因为canActivate不能再与loadChildren一起添加。例如,在angular的旧版本中,顺序似乎无关紧要:在此处提交错误报告:根据您的回答创建另一个功能请求回答:这是个好主意!我对多提供商和/或如何检测提供商是否已经存在还不太熟悉,看看他们怎么说会很有趣。
0: {path: "login", component: ƒ}
1: {path: "", redirectTo: "books", pathMatch: "full"}
2: {path: "books", loadChildren: ƒ, _loadedConfig: LoadedRouterConfig}
3: {path: "**", component: ƒ}
0: {path: ":id", component: ƒ}
1: {path: "", component: ƒ}
2: {path: "login", component: ƒ}
3: {path: "", redirectTo: "books", pathMatch: "full"}
4: {path: "books", loadChildren: ƒ, _loadedConfig: LoadedRouterConfig}
5: {path: "**", component: ƒ}