Angular 2的ngOnInit未被调用。

23 浏览
0 Comments

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'。

0
0 Comments

问题原因:这个问题的原因是一个"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来解决这个问题。

0