主干-不管怎样,检查事件以前是否绑定过

Backbone - Anyway to check if an event has been bound before?

本文关键字:是否 绑定 事件 不管怎样 检查 主干      更新时间:2023-09-26

我在我的一个视图中这样做:

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

问题是,无论何时触发reset以及重新渲染,都会创建一个新的reset绑定,从而在继续的过程中产生2x、4x、8x等次的重新渲染。

将绑定移动到initialize部分有点棘手(这应该可以解决这个问题),但是由于这不是一个选项,是否有其他可用的解决方案,比如让Backbone检查这个事件以前是否绑定过,或者其他什么?

最好将绑定移动到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);
    //...
}

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

比如让Backbone检查此事件以前是否绑定过,或者其他什么?

当然。。

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

Backbone没有公开使其有用所需的大部分API。没关系,还是用吧。

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

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

然后,在每次渲染被称为时,防御性地解除函数绑定

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

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

在任何功能之外,我声明:

var boundalready =0

然后,在函数内部:

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

这对我来说效果很好。