js集合绑定了这种混淆

backbone.js collection bind this confusion

本文关键字:集合 绑定 js      更新时间:2023-09-26

这是我的集合视图的一个例子:

  mod.AppListView = Backbone.View.extend({
    initialize: function() {
      var self = this
      mod.collection.bind('add', self.addOne);
      mod.collection.bind('reset', self.addAll);
      _.bindAll(self, 'addOne', 'addAll');

      this.addAll();
    },
    events: {
    },
    addOne: function(myModel) {
      var view = new ListItemView({
        model: myModel
      });
    },
    addAll: function() {
      mod.collection.each(this.addOne);
    },
  });

在初始运行时工作正常。但是在随后的重置中,addAll's变成了集合而不是视图,因此addOne将无法工作。

要解决这个问题,我必须这样做:

mod.collection.bind('reset', self.addAll, this);

但是我认为这就是__bindall的意义。这不应该把这个设为视图吗?这可以解释吗?是否有一种方法可以始终确保这指向视图而不是集合?

谢谢。

_.bindAll必须出现在对该方法的任何引用之前。你搞反了。

  _.bindAll(self, 'addOne', 'addAll');
  mod.collection.bind('add', self.addOne);
  mod.collection.bind('reset', self.addAll);

当你调用_.bindAll时,它会将你指定的方法替换为一个已经包装/代理/装饰的方法,以确保上下文始终被正确设置。由于该方法正在被替换,因此您对该方法的任何引用都必须在替换发生之后进行。否则,参考文献将指向原始方法,_.bindAll将看起来没有工作。

对于_.bindAll和第三个参数…挑一个你喜欢的。我更喜欢在调用.bind时传递第三个参数,但这只是我。有些情况下,我不得不使用_.bindAll,虽然。它们都做同样的事情,它们只是做的方式不同。