2014-07-14 4 views
0
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 отображается дважды. Я подозреваю, что это может быть какое-то состояние гонки, но я не смог выяснить причину. У кого-нибудь есть идея?остановкаListening() гонки состояние?

+0

делает 'playlistModel.get («песни»)' всегда возвращают такая же ссылка на объект? В любом случае было бы безопаснее использовать 'stopListening()' без каких-либо аргументов, если это работает для вас. – psquared

ответ

0

Это может произойти, если playlistModel.get('songs') не возвращаются одни и те же объекты, попробуйте удалить только событие независимо объекты являются, как это:

this.stopListening(null, 'add'); 
+0

То же самое, когда я делаю 'this.stopListening()' без каких-либо аргументов. –

+0

Вы пробовали 'this.stopListening (null, 'add')'? –

+0

Yup. Не повезло :( –

Смежные вопросы