我在新的Ionic NavController上找不到官方的Ionic 4文档,我想知道我们是否可以假设ngOnInit()
将始终在我们正在导航的Ionic Page组件上被调用如果我们使用navCtrl.navigateRoot()
来触发导航,即使该页面的实例已经存在(如果我们已经访问过该页面,情况就是如此)。
在我看来,至少在使用navCtrl.navigateRoot()
时,总是在要导航到的页面组件上调用ngOnInit()
方法。不过,我不确定在哪里可以找到有关此行为的确认。
如果不是这种情况,那么建议什么方法来确保每次用户导航到页面时都执行页面组件的方法?
谢谢!
答案 0 :(得分:2)
Ionic 3的导航系统基于导航控制器,而您知道Ionic 4促进了Angular自然的导航方式-路由器。
在Ionic 3中,对于进入导航堆栈的组件/页面,ngOnInit()将触发一次。
因此,如果我们有一个导航堆栈和navCtrl.navigateRoot()(或在ionic 3中为navCtrl.setRoot())称为,它将替换/删除旧实例并引入新实例,生命周期挂钩将被叫。
在设计上,预计Ionic 4 nav控制器将支持相同的行为,但它将不支持延迟加载的组件。因此,每次调用nav.setRoot等效项时都会看到ngOnInit触发的原因是,因为您替换了堆栈中的组件(有效地破坏了它)并在其位置引入了新组件。
在某些情况下,它不会被调用(例如,如果您开始使用push / pop,并且您将以不破坏您的页面/组件的另一种方式来管理堆栈([page1,page2]),那么ngOnInit不会被调用。
对于生命周期挂钩,每次组件进入视图时都会调用该挂钩-您记得它曾经是ionViewDidEnter。您可以检查离子4是否仍然有效?文档并没有说它不受支持,反之亦然,没有证实它。
当我要切换到Ionic 4时,TBH我会考虑利用基于路由器的导航,因为Nav Controller现在在Ionic 4中更具有向后兼容性功能。