backbone.js集合绑定了这种混乱

Har*_*rry 1 javascript backbone.js

这是我的集合视图的示例:

  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);
    },
  });
Run Code Online (Sandbox Code Playgroud)

在初始运行时,这很好.但是在随后的重置中,addAll会成为集合而不是视图,因此addOne不起作用.

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

mod.collection.bind('reset', self.addAll, this);
Run Code Online (Sandbox Code Playgroud)

但我认为那是_.bindAll的意思?难道不应该将此视为观点吗?这可以解释一下吗?有没有办法始终确保这指向视图而不是集合?

谢谢.

Der*_*ley 5

_.bindAll必须在任何方法参考之前.你倒退了.

  _.bindAll(self, 'addOne', 'addAll');

  mod.collection.bind('add', self.addOne);
  mod.collection.bind('reset', self.addAll);
Run Code Online (Sandbox Code Playgroud)

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

至于_.bindAll第3个参数......选择你喜欢的那个.我更喜欢在调用时传递第3个参数.bind,但那只是我.但是有些情况我必须使用_.bindAll.他们两个都做同样的事情,他们只是以不同的方式做.