Backbone - 无论如何检查事件是否已被绑定?

时间:2012-09-13 03:54:14

标签: javascript backbone.js

我在我的一个观点中这样做:

render: function($options) {
    ...

    this.collection.on('reset', _(function() {
        this.render($options);
    }).bind(this));

    ....
}

问题是,每当reset以及重新渲染被触发时,都会创建一个新的reset绑定,从而产生2x,4x,8x等次的重新渲染因为它继续。

将绑定移动到初始化部分(应该解决此问题)有点棘手,但是因为它不是一个选项,是否有其他可用的解决方案,比如让Backbone检查此事件是否已被绑定,或者什么?

4 个答案:

答案 0 :(得分:2)

将绑定移至initialize是最好的,但假设你有充分的理由不这样做,你可以设置一个标志:

initialize: function() {
    var _this = this;
    this._finish_initializing = _.once(function($options) {
        _this.collection.on('reset', function() {
            _this.render($options);
        });
    });
    //...
},
render: function($options) {
    this._finish_initializing($options);
    //...
}

有很多不同的方法来实现标志,_.once只是很好地隐藏了标志检查。您还可以在render中触发一个事件,使其自己解除绑定:

initialize: function() {
    var finish_initializing = function($options) {
        /* your binding goes here ... */
        this.off('render', finish_initializing);
    };
    this.on('render', finish_initializing, this);
},
render: function($options) {
    this.trigger('render', $options);
    //...
}

这真的是相同的逻辑,只是穿着不同的衣服。您还可以在if中使用显式标记和render,或在this._finish中为initialize分配一个函数,该函数将delete this._finish

答案 1 :(得分:1)

  

喜欢让Backbone检查此事件之前是否已绑定,或者是什么?

不确定..

!!this.collection._events["render"]

Backbone没有公开使其有用所需的大部分API。没问题,无论如何都要使用它。

答案 2 :(得分:0)

首先,将事件处理函数定义为命名函数

var self = this;
var onReset = function() {
    self.render($options);
}

然后,每次渲染时防御性地取消绑定函数

this.collection.off('reset', onReset);
this.collection.on('reset', onReset);

答案 3 :(得分:0)

我最近使用javascript变量完成了这项工作。

在任何职能之外,我宣布:

var boundalready =0

然后,在函数内部:

if (boundalready == 0){
      boundalready = 1;
      bind(this);
    };

这对我很有用。