ngOnInit在我导航到另一个组件之后才会运行

时间:2016-09-30 07:48:28

标签: nativescript angular2-nativescript

在我的NativeScript应用程序中,我将路径设置为

export const routes = [
    { path: "",  component: AppComponent},
    { path: "home", component: HomeComponent},
    { path: "login", component: LoginComponent},
    { path: "news" , component: NewsComponent}
];

用户通过firebase登录后,用户将自动重定向到HomeComponent。我应该提一下,我有一个用户服务从AppComponent Constuctor被解雇,它确定用户是否已经登录,然后将他们重定向到登录或家庭。

我在整个组件中传播了console.log()以查看事情何时被触发,因此我可以尝试找出放置代码的位置。

import {Component, OnInit} from "@angular/core";
import {Page} from "ui/page";
import {RouterExtensions} from 'nativescript-angular/router';
import firebase = require("nativescript-plugin-firebase");

@Component ({
    selector : "home",
    templateUrl: "./pages/home/home.html",
    styleUrls: ["./pages/home/home.css"]
})
export class HomeComponent implements OnInit {

    private router;

    constructor(page: Page, router: RouterExtensions) {

        console.log("HOME CONSTRUCTOR TRIGGERED");
        page.actionBarHidden = false;
        this.router = router;
    }

    ngOnInit(){
        console.log("HOME NGONIT TRIGGERED");
    }

    goToNews(){
        this.router.navigate(["/news"]);
    }

} 

home.html我有一个触发goToNews()的按钮。当我加载应用程序时,我可以在我的控制台中看到HomeComponent构造函数被触发时,但我从未看到ngOnInit被触发。奇怪的是,当我点击按钮导航到/news时,我就会在控制台中看到HomeComponent ngOnInit。这是它的假设吗?

这一切都归结为一个全局的理解"在HomeComponent加载时,我试图找出放下逻辑的最佳位置。我读到把它放在构造函数中是一个坏主意并且在ngOnInit中使用它是理想的但是我不知道如果{I}尝试到ngOnInit后才会触发它会有什么意义离开组件。

请帮我理解这一点。

更新:我在ngOnInit中向AppComponent添加了一个console.log,并在应用首次加载时触发。因此,必须是服务中的导航导致ngOnInit无法在HomeComponent中触发。

1 个答案:

答案 0 :(得分:4)

尝试将router.navigate()放入一个单独的"区域":

导入:

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

注射:

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

适用:

this.zone.run(() => {
    this.router.navigate(["/news"]);
});

找到here