BX.proxy/BX.delegate
Описание
Function BX.proxy( Function func, Object context );
Function BX.delegate( Function func, Object context );
Две родственных функции, генерирующих «функцию-делегата», которая будет вызывать требуемую функцию в нужном контексте. Это может использоваться, например, для назначения метода какого-либо объекта в качестве обработчика события с сохранением контекста объекта.
Отличие между функциями в том, что BX.proxy при повторном вызове с теми же параметрами вернет не новую функцию-делегата, а ссылку на сгенерированную до этого функцию, что может быть полезно, например, если требуется отменить конкретный обработчик события.
Примечание: BX.delegate - аналог jQuery.proxy.
Примеры использования
Код для получения элемента, по которому был произведен клик:
_hadleMoreButtonClickHandler: function(e) { alert(BX.proxy_context.innerHTML); } BX.bind(BX('test'), 'click', BX.delegate(this._hadleMoreButtonClickHandler, this));
<script type="text/javascript"> function MyClass() { this.prop = 1; BX.bind(BX('link'), 'click', BX.proxy(this.handler, this)); } MyClass.prototype.handler = function() { alert(this.prop); BX.unbind(BX('link'), 'click', BX.proxy(this.handler, this)); } BX.ready(function(){ new MyClass(); }); </script> <a href="javascript:void(0)" id="link">Click Me</a>
function MyClass(){} MyClass.prototype.handler = function(){} var ob = new MyClass(); alert(BX.delegate(ob.handler, ob) == BX.delegate(ob.handler, ob)); // false alert(BX.proxy(ob.handler, ob) == BX.proxy(ob.handler, ob)); // true
Также приведем более практический пример, демонстрирующий передачу контекста исполнения при делегировании. Представим, что вызывается анонимная функция в следующем контексте:
My.prototype.test = function(d) { console.log(d); }; My.prototype.send = function() { BX.ajax.get(this._ajaxPage, post, function(data){ this.test(data); }); };
Достаточно стандартная ситуация, когда после ajax-запроса мы совершаем какие-то действия с данными. Однако при исполнении приведенного кода строка this.test(data); приведет к ошибке (т.к. в данном контексте this будет ссылаться на саму анонимную функцию). Для сохранения прозрачности кода достаточно обернуть вызов анонимной функции в BX.delegate:
My.prototype.test = function(d) { console.log(d); }; My.prototype.send = function() { BX.ajax.get(this._ajaxPage, post, BX.delegate(function(data){ this.test(data); }, this)); };
На этот раз строка this.test(data) выполнится без ошибок и обратится к методу вашего класса My.