Backbone.js ListenToOnce被调用两次
Backbone.js ListenToOnce gets called twice
我有一个视图(我将称之为父视图),其中有另一个视图。父视图包含使用"上下文菜单"事件的元素(右键单击时,会显示一组菜单选项)。当用户从菜单中选择一个项目时,它会触发一个回调。从那里,我在子视图中触发一个事件。这是我的触发器:
that.trigger("editFileFolder", {fileType: fileType});
在我的子视图的初始化函数中,我有这样的:
this.listenToOnce(this.options.parent,'editFileFolder', this.editFileObjectEvent);
editFileObjectEvent函数调用另一个要创建的视图(一个包含一些字段的对话框、一个取消按钮和一个保存按钮)。如果用户单击"取消",则一切正常。如果用户单击保存按钮,视图将执行ajax调用,保存到服务器,然后关闭对话框。但是,下次用户右键单击并选择同一菜单项时,editFileObjectEvent会被调用两次(导致对话框被添加到父视图两次)。
有人能解释一下为什么它被打了两次电话,以及如何解决这个问题吗?如果你想看具体的代码,请告诉我,我可以添加它。有很多,所以我不想淹没这个问题。
感谢
我认为调用this.listenToOnce
的函数被调用了两次。你应该尽量避免这种情况。但是,如果这不可能,您可以通过在绑定之前解除绑定来确保侦听器只绑定一次:
this.stopListening(this.options.parent, 'editFileFolder', this.editFileObjectEvent);
this.listenToOnce(this.options.parent, 'editFileFolder', this.editFileObjectEvent);
或者你可以在你的实例上有一个属性来防止绑定两次:
if (!this.__boundListener) {
this.listenToOnce(this.options.parent, 'editFileFolder', this.editFileObjectEvent);
this._boundListener = true;
}
所有侦听器都已在this._listeningTo
中注册,您可以通过搜索来检查事件是否已绑定。
你也可以重构你的代码:
MyModel.extend({
initialize: function() {
this.bindListenToOnce = _.once(this.bindListenToOnce);
},
abc: function() {
// do stuff
this.bindListenToOnce();
// do stuff
},
bindListenToOnce: function() {
this.listenToOnce(this.options.parent, 'editFileFolder', this.editFileObjectEvent);
}
});
相关文章:
- Meteor Router数据函数被调用两次
- Backbone.js ListenToOnce被调用两次
- 当我的单元测试失败时,回调被调用了两次
- 我的jQuery加载请求是否被调用了两次
- 为什么DTM数据元素被调用两次
- jQuery 方法调用了两次
- 模态中的数据关闭在单击时被调用两次
- 调用一个函数两次
- java-script 函数被调用两次
- 查找与通过两次调用地理编码创建的两个 latlng 对象的距离
- Primefaces:RequestContext.execute-调用了两次Javascript
- 在一个页面中包含两次的脚本中调用函数
- 调用随机函数Javascript,但不能两次调用相同的函数
- 如何防止在快速单击时两次调用en事件处理程序
- 在AngularJS中,一次进行两次调用是一种可接受的方法
- jquery停止两次调用委派事件
- 我没有'我不想两次调用自定义函数
- Javascript:两次调用函数会导致不必要的行为
- 当两次调用一个方法时,仅呈现一个SVG组件
- JavaScript在两次调用之间占用额外时间