javascript - Spine javascript 无法取消绑定(bind)代理回调

标签 javascript spine.js

我正在将 spine javascript 库用于独立的 javascript 应用程序。 我大量使用发布者/订阅者模型并将代理回调绑定(bind)到 spine 模型。 当我尝试解除绑定(bind)代理回调时,它并没有解除绑定(bind)。这仅发生在代理回调中。 一个演示代码

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() 被调用时,它会正确绑定(bind)它并且回调是正确的。 但是当 listener.unBind() 被调用时,解除绑定(bind)不会发生。

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

如有任何帮助,我们将不胜感激。

最佳答案

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

我制作了一个 jsfiddle 来轻松测试它: http://jsfiddle.net/SpoBo/cmUmT/2/

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

http://jsfiddle.net/SpoBo/cmUmT/7/ 写Spine还是推荐使用CoffeeScript,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 是否有工作演示。

关于javascript - Spine javascript 无法取消绑定(bind)代理回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786539/

相关文章:

javascript - jQuery 表行切换显示/隐藏与按钮关联

javascript - 脊椎、node.js (express) 和 Access-Control-Allow-Origin

javascript - spin.js 与 jquery 依赖关系的困难

javascript 推送 jquery 函数

javascript - Adobe DTM 广告拦截器标识符

javascript - 为什么整个 div 都是可点击的?

javascript - Vue组件在html中不可见

javascript - JS运行环境

javascript - 安装hemem无法找到strata依赖

javascript - 脊柱多个动画