2012-03-20 52 views
2

我正在使用脊柱JavaScript库的独立JavaScript应用程序。 我大量使用发布者/订阅者模型,并将代理回调绑定到主干模型。 当我尝试解除代理回调时,它不解除绑定。这只会在代理回调时发生。 的演示代码脊柱的JavaScript无法解除代理回调

var Listener = Spine.Model.sub({ 
onChange : function(){this.log("Hooray!!")}, 
log:function(msg){console.log("Rxed event"+msg);}, 
bind: function(){SomeModel.bind("onChange",this.proxy(this.onChange));}, 
unBind:function(){SomeModel.unbind("onChange",this.proxy(this.onChange));} 
}); 

var listener = new Listener(); 

listener.bind()把它叫做正确结合它和回调是正确的。 但是listener.unBind()被调用时,解除绑定不会发生。

如果回调没有被代理,它可以工作,但我需要正确的回调上下文,所以我需要代理它。

任何帮助将不胜感激。

+1

你应该添加标签spine.js到你的问题。 – antonjs 2012-03-20 12:21:25

+0

请使用正确的代码突出显示在工具栏上,并用'{}'或'CTRL + K' – Neysor 2012-03-21 10:46:36

回答

0

您应该做Spine.Class.sub,因为您不需要模型。 其次,将解除绑定更改为:SomeModel.unbind("onChange");。 这样所有回调被清除。但是你是对的......如果你打开或者不打开代理服务器打开绑定,它将不起作用。所以我希望你不需要解除特定的回调。

我做了一个的jsfiddle轻松测试: http://jsfiddle.net/SpoBo/cmUmT/2/

编辑: http://jsfiddle.net/SpoBo/cmUmT/3/ 通过使用下划线的bindAll功能,它的工作原理。我猜这个代理做了一些奇怪的事情,它会阻止解除绑定函数成功比较回调。

http://jsfiddle.net/SpoBo/cmUmT/7/ 虽然建议使用CoffeeScript编写Spine,并且CS有针对此问题的解决方案。只需使用“胖箭头”即可。但是,如果您不能使用CS,则只能使用CS生成的代码。我在第7版中以这种方式解决了这个问题。

基本上,它创建一个__bind函数,它从闭包返回代理函数。 之后,用代理函数覆盖原始函数。

__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; } 

someObject.onChange = __bind(someObject.onChange, someObject); 

而现在onChange将始终从someObject的上下文中调用。很酷的东西!但检查jsFiddle的工作演示。

+0

感谢您的回复。问题是我需要解除特定的回调,因为可能有多个回调附加到相同的模型。 SomeModel.unbind( “的onChange”);将解除所有回调 – user1280645 2012-03-21 13:16:49

+0

检查更新的答案。现在工作:) – SpoBo 2012-03-21 15:30:33

+0

是的..这个工程。非常感谢。如果Spine增加了对此的支持,那将会很棒。 – user1280645 2012-03-22 12:13:01