Angular 延迟加载组件在导航时重新呈现
Angular Lazy Loaded Component Re-renders on navigation
我们的应用程序已设置好,因此导航到一组特定路线的用户会延迟加载,如下所示:
{
path: path1,
component: Cmp1,
loadChildren: () => LazyLoadedModule,
}
我们使用路由器 link 导航到这些延迟加载的组件之一...
<tile
routerLink="path1/{{name}}/achildpath"
[state]=someData>
...
</tile>
我注意到单击此图块时路径 + 延迟加载组件尝试加载。最初传入正确的状态。但是,该组件会立即被销毁,然后该组件会以未定义状态再次加载! (加载时没有状态数据但加载了正确的组件)。问题是为什么组件会在第一次渲染时重新加载并自行销毁?这可能是路由器插座或延迟加载组件的问题吗?我们用于延迟加载组件的路由器出口在 Cmp1 中定义。
ngAfterViewInit is never called before getting destroyed
ngAfterViewInit 在销毁之前永远不会被调用。 OnDestroy
是在销毁之前调用的。但我认为你的意思是为什么 ngAfterViewInit 在 comp 被销毁之前从未被调用过。当 comp 在循环到达那里之前被销毁,或者它被调用两次等时,它可能会发生。https://blog.logrocket.com/angular-lifecycle-hooks/ 虽然没有看到其余代码,但确切的问题现在只是一个猜测。
除非 tile
是一个组件,否则您不能使用 Input/Output 那样传输数据。如果是,则建议在组件前加上 app-
之类的前缀,然后阅读代码的任何其他人都会知道发生了什么。 @Input() 装饰器应该用在选择器上,在你的情况下它应该是这样的:
<tile [state]="someData"></tile>
关于你的主要问题。您想要使用 routerLink 导航到一个组件,并在执行此操作时传递数据。问题是您在模板 <tile [state]=someData></tile>
中构造组件,这就是为什么第一次创建组件并正确传递数据的原因。然后您将用户导航到 "path1/{{name}}/achildpath"
并且 someData
不会被传递,因为您现在在一个新的 url 上,someData
不会被传递,因为以前的模板确实[state]=someData
已经不存在了。请参考这些例子:
https://stackblitz.com/edit/angular-pass-data-to-route-1-fhe267?file=src%2Fapp%2Fhome.component.ts
https://www.tektutorialshub.com/angular/angular-pass-data-to-route/
我们的应用程序已设置好,因此导航到一组特定路线的用户会延迟加载,如下所示:
{
path: path1,
component: Cmp1,
loadChildren: () => LazyLoadedModule,
}
我们使用路由器 link 导航到这些延迟加载的组件之一...
<tile
routerLink="path1/{{name}}/achildpath"
[state]=someData>
...
</tile>
我注意到单击此图块时路径 + 延迟加载组件尝试加载。最初传入正确的状态。但是,该组件会立即被销毁,然后该组件会以未定义状态再次加载! (加载时没有状态数据但加载了正确的组件)。问题是为什么组件会在第一次渲染时重新加载并自行销毁?这可能是路由器插座或延迟加载组件的问题吗?我们用于延迟加载组件的路由器出口在 Cmp1 中定义。
ngAfterViewInit is never called before getting destroyed
ngAfterViewInit 在销毁之前永远不会被调用。 OnDestroy
是在销毁之前调用的。但我认为你的意思是为什么 ngAfterViewInit 在 comp 被销毁之前从未被调用过。当 comp 在循环到达那里之前被销毁,或者它被调用两次等时,它可能会发生。https://blog.logrocket.com/angular-lifecycle-hooks/ 虽然没有看到其余代码,但确切的问题现在只是一个猜测。
除非 tile
是一个组件,否则您不能使用 Input/Output 那样传输数据。如果是,则建议在组件前加上 app-
之类的前缀,然后阅读代码的任何其他人都会知道发生了什么。 @Input() 装饰器应该用在选择器上,在你的情况下它应该是这样的:
<tile [state]="someData"></tile>
关于你的主要问题。您想要使用 routerLink 导航到一个组件,并在执行此操作时传递数据。问题是您在模板 <tile [state]=someData></tile>
中构造组件,这就是为什么第一次创建组件并正确传递数据的原因。然后您将用户导航到 "path1/{{name}}/achildpath"
并且 someData
不会被传递,因为您现在在一个新的 url 上,someData
不会被传递,因为以前的模板确实[state]=someData
已经不存在了。请参考这些例子:
https://stackblitz.com/edit/angular-pass-data-to-route-1-fhe267?file=src%2Fapp%2Fhome.component.ts
https://www.tektutorialshub.com/angular/angular-pass-data-to-route/