2012-03-20 9 views
2

私はスタンドアロンのjavascriptアプリケーションにspine javascriptライブラリを使用しています。 私はパブリッシャー/サブスクライバー・モデルを大量に使用し、プロキシー・コールバックを背骨モデルにバインドします。 プロキシされたコールバックのバインドを解除しようとすると、バインド解除されません。これはプロキシコールバックでのみ発生します。 デモコードlistener.bind()が、それは正しく、それを結合し、コールバックが正しいと呼ばれているスパイン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.unBind()が呼び出されると、バインド解除は実行されません。

コールバックがプロキシされていない場合は機能しますが、コールバックに正しいコンテキストが必要なため、プロキシが必要です。

ご協力いただければ幸いです。

+1

spine.jsというタグを質問に追加する必要があります。 – antonjs

+0

{{} 'や' CTRL + K 'のツールバーにある正しいコードのハイライトを使用してください。 – Neysor

答えて

0

モデルが不要なので、Spine.Class.subを実行する必要があります。 第2に、アンバインドをSomeModel.unbind("onChange");に変更します。 このようにして、すべてのコールバックがクリアされます。しかし、あなたは正しいのです...プロキシコールの有無にかかわらず、バインドを解除すると、機能しません。ですから、特定のコールバックのバインドを解除する必要はありません。それが動作アンダースコアのbindAll機能を使用することにより http://jsfiddle.net/SpoBo/cmUmT/3/http://jsfiddle.net/SpoBo/cmUmT/2/

編集:

は、私は簡単にそれをテストするためにjsfiddleを作りました。私は、プロキシがコールバックをうまく比較できないようにバインド解除関数を防ぐ何か変わったことをすると思います。

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でデモを確認してください。

+0

返信いただきありがとうございます。問題は、同じモデルに複数のコールバックが関連付けられている可能性があるため、特定のコールバックのバインドを解除する必要があることです。 SomeModel.unbind( "onChange");すべてのコールバックをアンバインドします – user1280645

+0

更新された回答を確認してください。今すぐ動作します:) – SpoBo

+0

はい..これは動作します。ありがとうございました。Spineがこれをサポートしてくれれば素晴らしかったでしょう。 – user1280645

関連する問題