路由到父路由时销毁所有子组件

Posted

技术标签:

【中文标题】路由到父路由时销毁所有子组件【英文标题】:Destroy all sub-components when routing to a parent route 【发布时间】:2018-12-19 08:46:17 【问题描述】:

我有一个应用程序,其中我的父路由重定向到加载整个视图的子路由。 在这里,我有许多组件从服务器获取数据并进行渲染。

基于某些条件,我使用不同的参数重定向到父路由。子路由再次加载了传递给它的刷新数据。

parent ---> child -------------------Components getting data from Server ----
   <-----Different params------------

但是在子路由中,有某些组件仍在显示旧数据。通常他们从服务器获取数据来渲染它。

在我看来,它们在重新路由到父路由时没有被破坏,因此使用旧数据而不是从服务器获取数据来呈现。

关于可能是什么问题的任何建议?

编辑:

看来这不是问题所在。重新布线时,组件会被正确销毁。问题在于未重新创建的服务。

Relevant Question

【问题讨论】:

【参考方案1】:

服务不会被重新创建,因为它们默认是单例实例。

根据 Angular 的文档:

服务是注入器范围内的单例。有在 给定注入器中的大多数服务实例。

只有一个root注入器,并且注册了UserService 用那个喷油器。因此,只能有一个 UserService 整个应用程序中的实例,以及注入 UserService 的每个类 获取此服务实例。

然而,Angular DI 是一个分层注入系统,这意味着 嵌套注入器可以创建自己的服务实例。角 一直创建嵌套注入器

解决办法:

如果你真的想在每个组件中创建一个新的服务实例,你必须在组件定义时为它们声明一个提供者。

@Component(
  selector: 'child2',
  templateUrl: './child2.component.html',

  // create a new instance of the service
  providers: [AngularService]
)

组件注入器是相互独立的,并且它们中的每一个 创建自己的组件提供服务的实例。

...

当 Angular 销毁这些组件实例之一时,它也会 销毁组件的注入器和注入器的服务 实例。

请参阅说明在 Angular 应用程序中注入服务的示例:https://stackblitz.com/edit/angular-service-injecton-test

Angular 文档:

https://angular.io/guide/dependency-injection#singleton-services

【讨论】:

【参考方案2】:

当您导航到类似的内容时:

/showMeSomething/[id]

Angular 知道这个 id 改变了,所以它重新加载它的数据 (ngOnInit)。但是当你的地址还在时:

/showMeSomething

每次输入时它仍然是同一个地址。所以没有新数据到达那里(没有 ngOnInit)。

您是否使用某些东西来保持组件的活力?

对此有一点复杂的解决方案:您必须为您的项目创建一个单例服务并将其导入父组件和子组件。在那里添加一个布尔值来定义是否要重新加载子数据。然后做类似的事情:

navigateToChildComponent()
  this.mySingleton.reload = true;
  this.router.navigate['blabla/mycomponent'];

然后添加一些 ngDoCheck - 它一直有效。

ngDoCheck()
  if(this.mySingleton.reload)
    this.mySingleton.reload = false;
    this.getMyData();
   

但还是告诉我你是否使用了一些东西来让项目中的组件保持活力,以及你是如何使用它的。

https://angular.io/guide/lifecycle-hooks#lifecycle-sequence

【讨论】:

不,我没有使用任何东西来保持组件的活力。最初 /auth/:id1/:id2/:id3 被加载。这将重定向到另一个组件,该组件是功能的容器。现在根据条件,我想用不同的值重新加载上面的 url。我希望既然我们已经重定向到 /auth/... 因此容器中存在的所有组件都将被销毁,当我再次重定向时,它将加载新的值。

以上是关于路由到父路由时销毁所有子组件的主要内容,如果未能解决你的问题,请参考以下文章

LARAVEL - 使用 Route::resource 生成路由时无法使用销毁路由

Vue + VueX + Typescript + Vue 路由器。组件未销毁

在vue中使用路由器更改视图时销毁我的计数器实例

vue中动态路由组件缓存及生命周期函数

如何在重定向时销毁离子组件

删除/销毁和编辑路由