2012-09-21 76 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'的别名。 –