【问题标题】:Backbone.js ListenToOnce gets called twiceBackbone.js ListenToOnce 被调用两次
【发布时间】:2016-05-07 19:56:42
【问题描述】:

我有一个视图(我称之为父视图),其中有另一个视图(子视图)。父视图具有使用“上下文菜单”事件的元素(右键单击时,会显示一组菜单选项)。当用户从菜单中选择一个项目时,它会触发一个回调。从那里,我在子视图中触发一个事件。这是我的触发器:

  that.trigger("editFileFolder",  {fileType: fileType});

在我的子视图的初始化函数中,我有这个:

   this.listenToOnce(this.options.parent,'editFileFolder', this.editFileObjectEvent);

editFileObjectEvent 函数调用另一个要创建的视图(一个带有一些字段的对话框、一个取消按钮和一个保存按钮)。如果用户单击取消,一切正常。如果用户单击保存按钮,视图会执行 ajax 调用,保存到服务器并关闭对话框。但是,下次用户右键单击并选择相同的菜单项时,editFileObjectEvent 会被调用两次(导致对话框被两次添加到父视图中)。

谁能解释为什么它被调用两次以及如何解决这个问题?如果您想查看特定代码,请告诉我,我可以添加它。有很多,所以我不想压倒这个问题。

谢谢

【问题讨论】:

  • 我认为调用this.listenToOnce的函数被调用了两次
  • 嗯,看来你是对的。有没有办法确定这个监听器是否已经到位,所以我可以避免再次添加它?
  • 我不认为公共 API。不过你可以看看this._listeningTo

标签: javascript jquery backbone.js


【解决方案1】:

我认为调用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);
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 2012-05-05
    • 2017-01-19
    • 2014-02-04
    • 2016-12-13
    • 2016-01-30
    • 2015-12-20
    • 2019-04-04
    相关资源
    最近更新 更多