Angular 2的ngOnInit未被调用。
Angular 2的ngOnInit未被调用。
我正在构建一个使用Angular 2 beta.8版本的应用程序。
在这个应用程序中,我有一个实现OnInit接口的组件。
在这个组件中,我有一个名为ngOnInit的函数,但是ngOnInit函数从未被调用。
应用程序的路由如下:
@RouteConfig([
{
path: '/overview',
name: 'Overview',
component: OverviewComponent
},
{
path: '/login',
name: 'Login',
component: LoginComponent
},
{
path: '/register',
name: 'Register',
component: RegisterComponent,
useAsDefault: true
}
])
在LoginComponent和RegisterComponent中有一个检查,用于判断用户是否已经登录。
如果用户已经登录,组件将通过router.navigate(['Overview'])重定向到Overview页面。
如果我将Overview路由设置为默认路由,我会在控制台中看到ngOnInit的输出。
所以,我的页面重定向方式似乎是问题所在。
如何重定向到Overview页面并调用ngOnInit函数?
RegisterComponent和LoginComponent都使用以下代码:
ngOnInit() {
this._browser.getStorageValue('api_key', api_key => {
if (api_key) {
this._browser.gotoMain();
}
})
}
Browser是一个类,我在其中存储了特定于浏览器的代码。
这是gotoMain函数的实现:
gotoMain() {
this._router.navigate([this._browser.main]);
}
this._browser.main在这种情况下只是一个字符串'Overview'。
问题原因:这个问题的原因是一个"Zone"问题。
解决方法:解决这个问题的方法是注入NgZone,并在代码中使用zone.run()来强制执行回到Angular的zone中。
在Angular中,代码运行在一个经过修补的zone中,其中addEventListener()、setTimeout()和其他异步API被修补以通知Angular异步操作已经发生,从而重新运行变更检测。这使得变更检测非常高效。当调用的代码绕过Angular的zone时,Angular的变更检测不会触发。如果从在Angular的zone之外调用的代码中调用了一个方法(即使是从Angular组件或类似的代码中调用),直到该事件完全处理完毕之前,所有代码都在zone之外运行。通过使用zone.run(...),您可以强制执行回到Angular的zone中。
对于addEventListener(),您可以使用BrowserDomAdapter来解决这个问题。