繁体   English   中英

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

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

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

render: function($options) {
    ...

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

    ....
}

问题是,无论何时reset以及重新渲染都被触发,都会创建一个新的reset绑定,从而导致重新渲染2次,4次,8次等等。

将绑定移动到初始化部分(这应该解决这个问题)有点棘手,但是因为它不是一个选项,是否有其他可用的解决方案,比如让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);
    //...
}

这真是一样的逻辑,只是穿着不同的衣服。 您还可以在initialize使用显式标志和if in render或为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);
    };

这对我很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM