这是我的收藏夹视图的示例:

  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成为了集合,而不是视图,因此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与第3个参数...选择一个您喜欢的参数。我更喜欢在调用.bind时传递第3个参数,但这就是我。在某些情况下,我必须使用_.bindAll。他们俩都做同一件事,只是以不同的方式做。

关于javascript - 骨架.js集合消除了这种困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8656047/

10-12 12:20