Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干-是否仍要检查事件以前是否已绑定?_Javascript_Backbone.js - Fatal编程技术网

Javascript 主干-是否仍要检查事件以前是否已绑定?

Javascript 主干-是否仍要检查事件以前是否已绑定?,javascript,backbone.js,Javascript,Backbone.js,我在我的一个观点中这样做: render: function($options) { ... this.collection.on('reset', _(function() { this.render($options); }).bind(this)); .... } 问题是,只要触发了reset以及重新渲染,就会创建一个新的reset绑定,从而在执行时产生2倍、4倍、8倍等的重新渲染次数 将绑定移到initialize部分(这应该可以解决

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

render: function($options) {
    ...

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

    ....
}
问题是,只要触发了
reset
以及重新渲染,就会创建一个新的
reset
绑定,从而在执行时产生2倍、4倍、8倍等的重新渲染次数


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

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

var self = this;
var onReset = function() {
    self.render($options);
}
然后,每次调用render时,都会以防御方式解除绑定该函数

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

将绑定移动到
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);
    //...
}
有很多不同的方法来实现标志,只是很好地隐藏了标志检查。您还可以在
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
,或在
初始化
中为
分配一个函数。该函数将
删除此项。_finish
我最近使用javascript变量完成了此操作

在任何函数之外,我声明:

var boundalready =0
然后,在函数内部:

if (boundalready == 0){
      boundalready = 1;
      bind(this);
    };
这对我很有效

比如让主干网检查这个事件以前是否被绑定过,或者什么的

当然

!!this.collection._events["render"]
主干网不公开使其有用所需的大部分API。没关系,还是用吧