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がコールバックをクローンなどとしてラップすることです。スパイは 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();たバージョンでそれらを再バインドするを実行しました。

于 2013-05-30T19:48:57.373 に答える