Spine Javascript не может отменить прокси обратные вызовы - PullRequest
2 голосов
/ 20 марта 2012

Я использую библиотеку 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 Ответ

0 голосов
/ 21 марта 2012

Вы должны сделать Spine.Class.sub, так как вам не нужна модель.Во-вторых, измените привязку на: SomeModel.unbind("onChange");.Таким образом, все обратные вызовы очищаются.Но вы правы ... если вы заверните unbind с прокси-вызовом или без него, это не сработает.Поэтому я надеюсь, что у вас нет необходимости отвязывать определенные обратные вызовы.

Я сделал jsfiddle, чтобы легко его протестировать: http://jsfiddle.net/SpoBo/cmUmT/2/

edit: http://jsfiddle.net/SpoBo/cmUmT/3/ Используя подчеркиваниеbindAll функционал работает.Я предполагаю, что прокси-сервер делает что-то странное, что мешает функции unbind успешно сравнивать обратные вызовы.

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 для рабочей демонстрации.

...