簡體   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