2012-09-13 43 views
1

我这样做在我的画面之一:骨干 - 无论如何检查事件是否被绑定过?

render: function($options) { 
    ... 

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

    .... 
} 

的问题是,每当reset以及重新渲染被触发,新reset结合将被创建,造成2倍,4倍, 8倍等重新渲染的时间。

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

回答

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); 
    //... 
} 

这确实是同样的逻辑,只是打扮不同的衣服。您也可以使用明确的标志和render中的if或将函数分配给中的this._finish,该功能将delete this._finish

+0

完美的作品,非常感谢= D – Kay

0

首先,定义事件处理函数为命名的功能

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

然后,防守解除绑定的功能,每次渲染被称为

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

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

的任何功能之外,我宣布:

var boundalready =0 

然后,在函数内部:

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

这为我工作得很好。

1

像Backbone检查这个事件是否被绑定过,或者什么?

当然..

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

骨干不暴露最让它有用所需的API的。没关系,反正使用它。