我使用Backbone global作为事件总线构建项目。我们的想法是,一个视图将触发一个自定义事件并传入一些数据,然后任何正在侦听该事件的集合将使用该数据创建一个模型并将该模型添加到自身,并提供某种消息。
我注意到,如果我从应用程序的新实例开始并触发其中一个事件,那么在Chrome开发工具中,Backbone._events
看起来像这样:{'add_person': [Object] }
并运行相应的事件处理程序并处理值数组中的一个对象。到目前为止,非常好。
现在,让我说再次触发该事件处理程序。我注意到Backbone._events
看起来像{'add_person': [Object, Object]}
,事件处理程序运行两次,大概是在值数组的两个成员上,包括已经处理过的第一个成员。
我的问题是如何防止这种行为,缺少用once
绑定事件并在每次调用之后重新绑定它?感谢。
答案 0 :(得分:0)
我不完全确定你的设置是什么,即你是如何触发和聆听你正在解雇的这些事件,但听起来你可能会做类似的事情:
GlobalEventBus.on('add_person', this.addPerson, this);
假设您使用on
绑定到该事件,如果您的视图被销毁时未手动取消绑定侦听器,则这可能是您的问题。
在收听从您正在收听的对象外部的对象触发的事件时,最好使用Backbone的listenTo
。
因此,例如,在您的收藏中,您将改为:
this.listenTo(GlobalEventBus, 'add_person', this.addPerson)
但是,我还不完全确定你的设置是什么。
有关工作示例,请参阅此codepen。
每次只触发一个事件,但请记住,只添加了一个模型,因为每个模型都是重复的并且具有相同的ID。假设每个模型都是唯一的,它将被添加到集合中。