2012-03-20 4 views
2

독립 실행 형 자바 스크립트 응용 프로그램에 대해 spine javascript 라이브러리를 사용하고 있습니다. 게시자/구독자 모델을 많이 사용하고 프록시 된 콜백을 척추 모델에 바인딩합니다. 프록시 된 콜백의 바인딩을 해제하려고하면 바인드 해제되지 않습니다. 이는 프록시 된 콜백에서만 발생합니다. listener.bind()이 그것을 호출되는 데모 코드Spine 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을 수행해야합니다. 두 번째로 바인딩 해제를 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

예 ..이 작동합니다. 고마워요. 척추가 이것에 대한 지원을 추가하면 좋았을 것입니다. – user1280645

관련 문제