Events Ionic 2:在';行不通

Events Ionic 2:在';行不通,events,angular,promise,ionic2,Events,Angular,Promise,Ionic2,我有一个模式窗口,当您单击“添加”时,它会执行它的操作,取消,然后当承诺得到解决时,会发布一些事件,通知相关组件进行更新: this._viewControl.dismiss().then(() => this._events.publish('update_myJobsPage', null); this._events.publish('update_assessmentsPage', null); this._events.publish('update_b

我有一个模式窗口,当您单击“添加”时,它会执行它的操作,取消,然后当承诺得到解决时,会发布一些事件,通知相关组件进行更新:

this._viewControl.dismiss().then(() => 
    this._events.publish('update_myJobsPage', null);
    this._events.publish('update_assessmentsPage', null);
    this._events.publish('update_buildingPage', null);        
});
问题是,有时它有效,他们更新自己的视图,有时则不行。莫代尔总是不屑一顾,尽管如此,事件还是发生了

我在这里犯了什么根本性的错误吗


谢谢。

你试过onDismiss吗

 this._viewControl.onDismiss(() => {
    this._events.publish('update_myJobsPage', null);
    this._events.publish('update_assessmentsPage', null);
    this._events.publish('update_buildingPage', null); 
   });

所以,事实证明,如果我在提神的时候清空我的收藏,那么

e、 g

然后页面总是显示更新。所以我将把这个问题归结为Angular 2中的计时/变化检测错误,然后继续

问题是,有时它起作用,他们有时更新自己的视图 不是

正如您在中所读到的,应用程序状态更改由三个因素引起:

1) 事件-用户事件,如单击、更改、输入、提交等

2) XMLHttpRequests—例如,从远程服务计时器获取数据时-

3) setTimeout(),setInterval(),因为JavaScript

事实证明,只有在这些情况下,Angular才真正有兴趣更新视图。

所以如果你想用Angular以外的方式更新其他东西,你必须让Angular知道有些东西已经改变了,需要我们意识到更新的东西。您可以通过以下方式首先导入
ngZone

constructor(..., private ngZone: NgZone ) { //... }
从'@angular/core'导入{…,NgZone}

构造函数中声明它,如下所示:

constructor(..., private ngZone: NgZone ) { //... }
然后将代码包围在一个区域内


只是一个建议,你能不能不让一个事件
update_pages
并让每个页面处理相同的事件?我可以这样做,但我更喜欢让每个页面订阅自己的事件,这样我就可以更精确地控制哪些页面更新以及何时更新。好的。我认为LeRoy建议使用
onDismiss()
至少是触发事件的正确方法,不管这是否会解决您的问题,虽然我不知道,谢谢,但这不是正确的解决方案。使用dismise()。然后(…)是从我找到的Ionic 2文档中声明的方法,它在我的应用程序中的任何其他地方都有效!请阅读我的答案。该页面显示更新,因为应用程序状态更改是由XMLHttpRequests引起的(当调用
someService
服务时)。但你们可以通过使用NgZone来改善这一点。实际上不是,因为我的服务是从本地存储数据库获取的,而不是外部http服务。哦,我明白了。。。也许
then()
与此有关?今天晚些时候我会做一些测试。顺便说一句,谢谢@Dave让我知道。没问题,谢谢你的深入解释。我认为我的问题的关键在于它有时有效,有时无效,这意味着它不是一个角度2变化检测问题,而是一个承诺、转换(模式页面忽略动画)和离子2框架的时间问题。事实证明,这并没有完全起作用。与NgZone合作。谢谢
this._viewControl.dismiss().then(() => 

  this.ngZone.run(() => {
    // Execute here what you want and Angular will update the view for you.
    // ...    
    this._events.publish('update_myJobsPage', null);
    this._events.publish('update_assessmentsPage', null);
    this._events.publish('update_buildingPage', null);

  });     
});