我正在尝试设置我的集合来监听集合中模型触发的事件,如下所示:
var Collection = Backbone.Collection.extend({
initialize: function() {
this.on('playback:completed', this.playNext);
},
playNext : function() { }
});
在我的测试中,我将新的Backbone.Model添加到集合的实例中,然后在它们上触发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();
});
});
答案 0 :(得分:2)
这里的问题是,骨干的.on
将回调包装为克隆或类似的东西。由于间谍是在Collection.initialize运行之后设置的,所以在设置间谍之前被包装的回调是函数,它永远不会被触发。
我解决的解决方案是将事件绑定拉入bindEvents
函数,如下所示:
var Collection = Backbone.Collection.extend({
initialize: function() {
this.bindEvents();
},
bindEvents : function() {
this.on('playback:completed', this.playNext);
},
playNext : function() { }
});
然后,在我的测试中(在设置间谍之后),我运行了collection.off(); collection.bindEvents();
,它将它们与间谍版本重新绑定。