stopListening()竞争条件?

时间:2014-07-14 20:14:03

标签: javascript jquery backbone.js

var PlaylistView = Backbone.View.extend({
  el: '#expanded-container',

  initialize: function() {
    var playlistModel = this.model;
    this.stopListening(playlistModel.get('songs'), 'add');
    var form = this.$('input');
    $(form).keypress(function (e) {
      if (e.charCode == 13) {
        console.log("hey")
        var query = form.val();
        playlistModel.lookUpAndAddSingleSong(query);
      }
    });

    this.listenTo(playlistModel.get('songs'), 'add', function (song) {
      var songView = new SongView({ model: song });
      this.$('.playlist-songs').prepend(songView.render().el);
    });

这是我的Backbone视图的片段,我无法弄清楚为什么有时相同的songView呈现两次。在其他视图中,我手动调用PlaylistView.initialize()而不重新创建视图。因此,我在初始化开始时取消注册所有事件,以防止它多次侦听同一事件。它完成了它的工作但只是偶尔一次,同一个songView被渲染两次。我怀疑这可能是某种竞争条件,但我无法弄清楚原因。有没有人有想法?

1 个答案:

答案 0 :(得分:0)

如果playlistModel.get('songs')没有返回相同的对象,可能会发生这种情况,尝试只删除对象所在的事件,如下所示:

this.stopListening(null, 'add');