【问题标题】:How to re-instantiate/destory a component in Angular-6如何在 Angular-6 中重新实例化/销毁组件
【发布时间】:2019-05-19 20:43:32
【问题描述】:
  1. 你能从组件本身检查组件实例的存在吗?

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

我的一个组件似乎有问题。当使用不同的参数连续多次访问时,组件的 ngAfterViewInit 仅在第一次触发(我假设组件被实例化时)。 后续访问不会导致触发 ngAfterViewInit, 即,看起来好像它正在重用相同的组件实例或其他东西......但是,我可以识别参数并使用更改的参数做必要的事情......

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

我的目标是每次访问路线时都重新启用组件。

所以

  1. 你能从组件本身检查组件实例的存在吗?

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

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

我的设置

延迟加载模块 -> mdm

const routes: Routes = [

  {
    path: '',
    component: HomeComponent,

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

菜单锚链接

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

【问题讨论】:

    标签: angular angular-lifecycle-hooks


    【解决方案1】:

    肯定有另一种方法可以做到这一点。

    为了回答您,您可能可以检查组件实例的存在,并且您可能可以按需重新创建它。

    但你不应该。

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

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

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

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

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

    我已通过管道将 observable 仅监听堆栈的最后一个事件(否则,您的订阅将运行很多次)。

    【讨论】:

    • thanx for that.. 将尝试合并到代码中.. 因为我的组件在某种意义上有点复杂,它动态创建 TABS、表单控件、使用数据填充 SELECT 选项(通过 DOM 操作)调用等..全部来自后端的元数据..它是一个动态的(基于路由上的参数)CRUD组件..我认为最好销毁现有实例(可能在ctor中)并让角度处理其余部分。 . 即,模拟导航到不同的 url(从而破坏组件的现有实例).. 你怎么看,如何实现?
    • 我认为你错了,你不应该那样做。从某种意义上说,如果您需要动态创建某些东西,则您有一个设计缺陷,不应该在构造函数中完成(或者在 Angular 的情况下,生命周期挂钩)。我给你最好的做法来做你想做的事:你问的是help on something you think will work, but you have no idea if it really will
    • @trichetriche ..我想你误解了我... CTOR 只会破坏现有实例,也许会初始化一些变量...显然我不会在 ctor 中做大量的调整.. 事情已经在工作条件...但是,我正在重新考虑,正如您所说,尝试引入最佳实践..
    • 哦,不,我很好,不用担心。我将以不同的方式呈现给您:您正在尝试覆盖路由器(效果很好)以满足您的需求。您正在尝试重写 Angular 的工作方式(并且已经工作了五年),因为您找不到如何做您想做的事情。看看听起来有多糟糕?相反,正如您所说,您应该在审查 Angular 的行为之前实施最佳实践并审查您自己的代码。 (对不起,如果这冒犯了你,那不是我的目标)
    • @ trichetriche .. 一点也不.. 我一点也不生气.. 我也不打算重写 angular 方式.. 我正在探索 angular 以移植我的大型应用程序之一.. 所以原型这个复杂的组件并了解有关 Angular 内部结构的更多信息..我可以理解为什么 Angular 会一直保留组件实例直到最后一刻..但是,如果程序员有办法干预或配置来告诉在重新访问同一路由时重新实例化组件的框架。如果您访问另一条路线,框架无论如何都会这样做..
    猜你喜欢
    • 2020-05-05
    • 2019-07-28
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多