以编程方式路由回页面时,Angular不会调用ngOnInit

时间:2018-01-08 19:24:17

标签: angular typescript routing

我已经实施了以下控制台输出,以跟踪已执行的内容以及未执行的操作。 / dataList 下的页面代码。

export class DataList implements OnInit {

  constructor(private service: DataService) { 
    console.log("constructed");
  }

  ngOnInit() {
    console.log("inited");
    ...
  }

}

现在,它通过输入URL ,在控制台中同时提供输出(即构造 inited ) >以及使用从其他页面进行路由访问页面时,如下所示。

this.router.navigateByUrl("/dataList");

但是,当我从此页面导航到详细页面时,它不显示已启动(仅构造)(其中包含 / dataElement等网址/ 12345 ,其中 12345 是一个ID),然后返回到执行上面显示的URL导航的页面 / dataList 。 (如果我然后点击F5,我会看到构造 inited 。)

我没有想到进入构造函数而不进入ngOnInit,考虑到已实现的界面,但显然,我错了(并且也非常困惑)。

我能做的最好的诊断是,当从子路径路径导航时,不会调用初始化。但这对我来说似乎很奇怪,所以我怀疑我还没有正确诊断它。谷歌搜索没有产生任何我认为充分相关的内容(like thisthis)。路由就像这样。

const routes: Routes = [
  { path: "", component: StartComponent },
  { path: "dataList", component: DataListComponent },
  { path: "dataElement/:id", component: DataElementComponent },
  ...
  { path: "**", component: StartComponent }
];

1 个答案:

答案 0 :(得分:5)

在我有一些令人难以置信的天才罢工之后(a.k.a.哑巴运气),我看到了一些关于Angular 5中的错误的东西(以及一些4s)。显然,杀死这个问题的魔力就像这样。

import { NgZone, ... } from "@angular/core";

export class DataElement implements OnInit {

  constructor(private zone: NgZone, ... ) { ... }

  shaboo() {
    ...
    this.zone.run(() => {
      this.router.navigateByUrl("/dataList");
    });
  }
}

现在,我不知道它做了什么,甚至更少想法如何或为什么。我只是复制this place中的代码示例,如this reply中所述。这是不了解正在发生的事情的最短途径,我完全讨厌它,所以如果有人想提供关于这个主题的一些指示,我会欣喜若狂(同样,如果这些解释了这样一个简单的问题仍然会导致问题)版本5,这将更加棒极了。