Цитата |
---|
Александр Медведев написал: Ахат Баязи , всё хотел спросить - в чём практический смысл оборачивать обработчики в BX.delegate? В том же Firefox потом из-за этого нифига не понятно какой обработчик навешан на событие элемента |
В оф. инструкции о BX.proxy и BX.delegate сказано:
Цитата |
---|
Две родственных функции, генерирующих «функцию-делегата», которая будет вызывать требуемую функцию в нужном контексте. Это может использоваться, например, для назначения метода какого-либо объекта в качестве обработчика события с сохранением контекста объекта.Отличие между функциями в том, что BX.proxy при повторном вызове с теми же параметрами вернет не новую функцию-делегата, а ссылку на сгенерированную до этого функцию, что может быть полезно, например, если требуется отменить конкретный обработчик события. |
При создании объекта (как правило при загрузке страницы) в объекте инициализируются ОООГРОМНАЯ толпа переменных, методов и свойств объекта, которые могут динамически меняться в результате работы скриптов. Так вот самый простой способ получить к ним доступ в объекте через ключевое слово this.:
this.СВОЙСТВО, this.МЕТОД или this.ФУНКЦИЯ().
Все просто пока мы не начнем делать вложенность в объекте. Например, у нас есть объект, с набором методов и свойств, которые имеют свои свойства и методы.
Так вот this, будет ссылаться на объект, который стоит перед точкой, и таким образом получить данные которые имеет объект при инициализации недоступны.
А теперь живой кейс:
Объект: BX.CrmProductEditor (bitrix/components/bitrix/crm.product_row.list/templates/.default/script.map.js)
Код |
---|
BX.CrmProductEditor.prototype = { ... инициализация, и объявление переменных ... w4aSaveProductRows: function(){ // alert('tutut-' + this._serviceUrl) let isDirector = false; let w4aDirOptions = []; if(this.isDirector()) { isDirector = true; w4aDirOptions = [ { 'id': 'W4A_DIR_TOTAL_DDP_KZT_BOTTOM', 'value': BX('W4A_DIR_ADD_PAY_KZT_BOTTOM').dataset.value }, { 'id': 'W4A_DIR_TOTAL_SUM_KZT_BOTTOM', 'value': BX('W4A_DIR_TOTAL_SUM_KZT_BOTTOM').dataset.value }, { 'id': 'W4A_DIR_ADD_PAY_KZT_BOTTOM', 'value': BX('W4A_DIR_ADD_PAY_KZT_BOTTOM').dataset.value }, { 'id': 'W4A_DIR_MARGE_KZT_BOTTOM', 'value': BX('W4A_DIR_MARGE_KZT_BOTTOM').dataset.value }, { 'id': 'W4A_DIR_COMMENT_BOTTOM', 'value': BX('W4A_DIR_COMMENT_BOTTOM').value }, ]; } BX.ajax({ 'url': this._serviceUrl, 'method': 'POST', 'dataType': 'json', 'data': { 'MODE': 'W4A_SAVE_PRODUCTS', 'OWNER_TYPE': this.getSetting('ownerType', ''), 'OWNER_ID': this.getSetting('ownerID', 0), 'PERMISSION_ENTITY_TYPE': this.getSetting('permissionEntityType', ''), 'PRODUCT_ROW_DATA': this.productsToJson(), 'PRODUCT_ROW_SETTINGS': { 'ENABLE_DISCOUNT': this.isDiscountEnabled() ? 'Y' : 'N', 'ENABLE_TAX': this.isTaxEnabled() ? 'Y' : 'N' }, 'SITE_ID': this.getSetting('siteId', ''), 'W4A_IS_DIRECTOR': isDirector, 'DIR_OPTIONS': JSON.stringify(w4aDirOptions) }, // onsuccess: BX.delegate(this._onSaveProductsRequestSuccess, this), // original onsuccess: BX.delegate(this._w4aOnSaveProductsRequestSuccess, this), onfailure: BX.delegate(this._onSaveProductsRequestFailure, this) }); }, ... }) |
а очень хочется.
Вот тогда помогает делегирование ( onsuccess: BX.delegate(this._w4aOnSaveProductsRequestSuccess, this))
И мы делегируем методу _w4aOnSaveProductsRequestSuccess обработку результата, с передачей ему полученных результатов.
=============================
ЗЫ Не знаю правильно ли я объяснил, тут наверное про this лучше написано