gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:42:36 30 4
gpt4 key购买 nike

我正在将 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com