离子事件触发太多次。每次触发时增加一?
Posted
技术标签:
【中文标题】离子事件触发太多次。每次触发时增加一?【英文标题】:Ionic event fires too many times. Incremented by one each time it's triggered? 【发布时间】:2018-08-09 09:03:39 【问题描述】:TL;DR:订阅事件触发次数过多。
我设置了一个事件,当实时数据通过套接字进入时,该事件会被触发。
通过控制台日志我发现,实时数据只正确输入一次。被触发的事件,当实时数据进来时,也只会被触发一次:
console.log("Event publish got fired!");
this.events.publish(EVENTSLUG_STAMP_UPDATE);
每次数据进入时我只看到这个控制台日志一次。
奇怪的部分来了:订阅事件触发了多次!每次实时数据进来,都会再次触发一次。
this.events.subscribe(EVENTSLUG_STAMP_UPDATE, () =>
console.log("Event gets gets handled!");
// Do some code here. This code gets done to many times.
);
所以我看到第一次实时数据进来:
Event publish got fired!
Event gets gets handled!
在控制台中。第二次,我明白了
Event publish got fired!
Event gets gets handled!
Event gets gets handled!
我第三次看到:
Event publish got fired!
Event gets gets handled!
Event gets gets handled!
Event gets gets handled!
等等。我正在使用 socket.io 获取实时数据。但正如我所说,用控制台日志填充我的代码我得出的结论是,只有订阅事件会触发多次。每次事件再次发布时递增 1。
编辑
我找到了一个可行的解决方法:
this.events.subscribe(EVENTSLUG_STAMP_UPDATE, () =>
this.navCtrl.setRoot('ScanSuccessPage').then(() =>
this.events.unsubscribe(EVENTSLUG_STAMP_UPDATE);
);
);
【问题讨论】:
this.events.subscribe 在哪里...? 在被设置为 root 的页面的构造函数内部,例如navCtrl.setRoot('PageWIthSubscription')
。我找到了解决方法,请参阅编辑 :)
【参考方案1】:
所以我也花了一点时间来解决这个问题。对我来说,最终结果是我在一个组件上使用了subscribe()
,当我在应用程序中导航时,该组件被销毁并重新创建,但是我在使用unsubscribe()
的组件上没有OnDestroy
事件处理程序,所以每次它被实例化了,它添加了另一个订阅处理程序。
注意:您还必须将 same 事件处理程序传递给unsubscribe()
,请参阅Ionic2: Unsubscribe Event to Avoid Duplicate Entries?
【讨论】:
【参考方案2】:不再使用时删除它(遗憾的是它不使用“一次”)
//handler as property
private handler=(args)=>...;
...
events.subscribe(handler);
...
notMoreNeeded()//call this when you don't want event is shooted more
this.events.unsubscribe(handler)
【讨论】:
如果您打算在从另一个页面弹出时使用该订阅,您可能不应该放在这里。 ionViewWillUnload 可能是一个更好的地方以上是关于离子事件触发太多次。每次触发时增加一?的主要内容,如果未能解决你的问题,请参考以下文章