2012-09-21 109 views
2

我有一個控制HTML5音頻播放器的音頻播放器類。我正在監視音頻播放器事件並將其觸發到關聯的視圖。在視圖文件這是我如何綁定適當的事件從Backbone.js中取消綁定模型

app.audioPlayer.$el.bind('musicEnded', _.bind(this.onMusicEnded, this)); 
app.audioPlayer.$el.bind('askForNextMusic', _.bind(this.onAskForNextMusic, this)); 
app.audioPlayer.$el.bind('askForPreviousMusic', _.bind(this.onAskForPreviousMusic, this)); 

一旦我從這個視圖移出,我想解除從這個視圖的事件。我就是這樣試過的

app.audioPlayer.$el.unbind('musicEnded', _.bind(this.onMusicEnded, this)); 
app.audioPlayer.$el.unbind('askForNextMusic', _.bind(this.onAskForNextMusic, this)); 
app.audioPlayer.$el.unbind('askForPreviousMusic', _.bind(this.onAskForPreviousMusic, this)); 

但它似乎有劑量效應。我該如何在backbonejs中正確地做到這一點? 由於

+2

如果你有更多的示例代碼來表明你正在嘗試完成,我們可能會有更多的幫助。 –

+0

任何你不使用[events hash](http://documentcloud.github.com/backbone/#View-delegateEvents)的原因?還有你試過[undelegating](http://documentcloud.github.com/backbone/#View-undelegateEvents)事件? – Jack

回答

2

您的代碼的問題是,您使用_.bind綁定/解除綁定。因爲這將始終創建一個新功能。所以你綁定的函數和你試圖解除綁定的函數是不一樣的,所以解除綁定是行不通的。

您必須保存對您綁定函數的引用,或者在開始時使用_.bindAll,因爲這會將當前函數替換爲綁定函數。所以,當你使用綁定/解除綁定,那麼它是相同的功能:

_.bindAll(this, onMusicEnded) 
// the will replace this.onMusicEnded with _.bind(this.onMusicEnded, this) 
app.audioPlayer.$el.bind('musicEnded', this.onMusicEnded); 
app.audioPlayer.$el.unbind('musicEnded', this.onMusicEnded); 
0

http://backbonejs.org/#Events

綁定的回調函數的一個對象。回調將在事件觸發時被調用。

object.on(event, callback, [context]) 

從對象中刪除以前綁定的回調函數。

object.off([event], [callback], [context]) 
+0

我試過這個,但沒有工作。你能看看我綁定的方式,並告訴我什麼是錯的? – Zach

+0

@Zach如果你可以發佈你想要在http://jsfiddle.net/上執行的實際代碼,如果你有更多的示例代碼來表明你想要完成什麼,我們可能會有更多的幫助。 –

+0

問題是他試圖解除綁定的功能與一個綁定不一樣。 'on'和'off'只是'bind'和'unbind'的別名。 –