如何在Angular-6中重新实例化/存储组件

时间:2018-12-19 11:00:29

标签: angular angular-lifecycle-hooks

  1. 您可以从组件本身检查组件实例的存在吗?

  2. 您可以销毁现有实例并创建一个新实例吗?

我似乎对我的组件之一有疑问。当使用不同的参数连续访问多次时,组件的ngAfterViewInit仅首次触发(我假设组件实例化的时间)。 后续访问不会引发ngAfterViewInit,,即看起来好像正在重用相同的组件实例或其他东西……但是,我可以识别出参数,并对更改后的参数进行处理。 / p>

但是,如果我访问一条新路线并返回有问题的路线/组件,则它可以正常运行。我可以看到它在新路线和相应组件启动之前就被破坏了。

我的目标是在每次绕行路线时都要重新设定该组件的作用。

所以

  1. 您可以从组件本身检查组件实例的存在吗?

  2. 可以从代码中销毁现有实例并创建一个新实例吗?

或者还有其他方法可以解决这个问题。

我的设置

延迟加载的模块-> mdm

const routes: Routes = [

  {
    path: '',
    component: HomeComponent,

    children : [
                  { path: ':id' , component : AComponent }
    ]
  }

菜单锚链接

  1. mdm / 1000
  2. mdm / 2000等等等

1 个答案:

答案 0 :(得分:0)

肯定有另一种方式。

为回答您,您可能可以检查组件实例的存在,也可以根据需要重新创建它。

但是你不应该。

这不仅是矫kill过正,而且还应该让Angular管理喷油器,否则(如果您不知道自己在做什么),将会遇到一些有趣的问题。

向您简要地解释一下:重新加载路由不会触发组件的生命周期。组件的生命周期在实例化时开始,在销毁时结束(这意味着“不再在DOM中”)。

当您重新加载路线时,该组件不会被破坏,因此是您的问题。

要解决此问题,请在您的生命周期挂钩中订阅路由更改事件:

ngAfterViewInit() {
  this.router.events
    .pipe(filter(event => event instanceof NavigationEnd))
    .subscribe(event => /* do something */);
}

我已经将可观察对象传递给仅监听堆栈的最后一个事件(否则,您的订阅将运行很多次)。