2

我正在尝试设置我的集合以侦听集合内模型上触发的事件,如下所示:

var Collection = Backbone.Collection.extend({
  initialize: function() {
    this.on('playback:completed', this.playNext);
  },
  playNext : function() { }
});

在我的测试中,我将新的 Backbone.Models 添加到集合的一个实例中,然后触发playback:completed它们......并且playNext没有被调用。如何正确设置?

编辑:添加测试代码(使用 Jasmine):

var collection;

describe('Collection', function() {

  beforeEach(function() { 
    collection = new Collection();
  });

  it('should playNext when playback:completed is triggered', function() {
    var model1 = new Backbone.Model();
    var model2 = new Backbone.Model();
    var spy = spyOn(collection, 'playNext').andCallThrough();
    collection.add(model1);
    collection.add(model2);
    model1.trigger('playback:completed');
    expect(spy).toHaveBeenCalled();
  });
});
4

1 回答 1

2

这里的问题是主干.on将回调包装为克隆或类似的东西。由于 spy 是在 Collection.initialize 运行后设置的,因此被包装的回调是设置 spy 之前的函数,它从未被触发。

我决定的解决方案是将事件绑定拉入一个bindEvents函数,如下所示:

var Collection = Backbone.Collection.extend({
  initialize: function() {
    this.bindEvents();
  },
  bindEvents : function() {
    this.on('playback:completed', this.playNext);
  },
  playNext : function() { }
});

然后,在我的测试中(并且在设置了间谍之后),我运行了collection.off(); collection.bindEvents();,它将它们与间谍版本重新绑定。

于 2013-05-30T19:48:57.373 回答