@brees

Как написать хороший javascript для Битрикс компонента?

Есть компонент со сложной js логикой, который может встраиваться на страницу посредством ajax, необходимо инициализировать обработчики и т.д., первое, что приходит в голову написать что-то такое:
class ShopSection {
  constructor(id) {
    this.elem = document.getElementById(id);
    ...
  }
  initMap() {
    ...
  }
}

Но тут вопрос, как из этого скрипта получить ссылку(id или class) на наш компонент(общую обертку div например), чтобы несколько компонентов на странице работали корректно и не мешали друг другу ?
Можно ли сгенерировать уникальный id компонента, который можно просто передать:
<div id="<?php echo %UNIQUE_ID% ?>">
...
</div>
<script>
new ShopSection(<?php echo %UNIQUE_ID% ?>);
</script>

Или же это плохая идея ? Как вы действуете в таких ситуациях и в каком стиле пишите свой js под Битрикс ?
  • Вопрос задан
  • 912 просмотров
Решения вопроса 1
WebDev2030
@WebDev2030
Битриксоид до мозга и костей
Примерно так и делается. В компоненте bitrix:catalog.section со списком товаров уникальный ID для товара генерируется так:
$uniqueId = $item['ID'].'_'.md5($this->randString().$component->getAction());
//$item['ID'] - ID товара
//$this->randString() - рандомная строка
//$component->getAction() - по документации "Метод возвращает название текущего действия."

//Ниже пример подключения JS к списку товаров
$obName = 'ob'.preg_replace('/[^a-zA-Z0-9_]/', 'x', $this->GetEditAreaId($navParams['NavNum'])); //название переменной в которой, помещен JS-объект с логикой компонента.

//Ну и создание объекта в который передаются параметры.
var <?=$obName?> = new JCCatalogSectionComponent({
		siteId: '<?=CUtil::JSEscape($component->getSiteId())?>',
		componentPath: '<?=CUtil::JSEscape($componentPath)?>',
		navParams: <?=CUtil::PhpToJSObject($navParams)?>,
		deferredLoad: false, // enable it for deferred load
		initiallyShowHeader: '<?=!empty($arResult['ITEM_ROWS'])?>',
		bigData: <?=CUtil::PhpToJSObject($arResult['BIG_DATA'])?>,
		lazyLoad: !!'<?=$showLazyLoad?>',
		loadOnScroll: !!'<?=($arParams['LOAD_ON_SCROLL'] === 'Y')?>',
		template: '<?=CUtil::JSEscape($signedTemplate)?>',
		ajaxId: '<?=CUtil::JSEscape($arParams['AJAX_ID'])?>',
		parameters: '<?=CUtil::JSEscape($signedParams)?>',
		container: '<?=$containerName?>'
	});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы