bender-nvkz

bitrix ajax componentTemplate js canjs controller

Jul 25th, 2016
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function ($) {
  2.     App.Widgets.<contextname> = App.Widgets.<contextname> || {};
  3.  
  4.     App.Widgets.<contextname>.<blockname> = can.Control.extend(
  5.         {
  6.             pluginName: '<pluginName>',
  7.             defaults: {}
  8.         },
  9.         {
  10.             // init выполняется всегда после загрузки страницы
  11.             init: function () {
  12.  
  13.                 // определяем ключ доступа к компоненту по ajax
  14.                 this.ajaxKey = this.element.find('.js-template-name-ajax-key').val();
  15.  
  16.                 // запускаем наш ajax пейджер
  17.                 this.initAjaxPagen();
  18.  
  19.             },
  20.  
  21.             initAjaxPagen: function () {
  22.                 // наш блок, с кнопкой, находится внутри блока с элементами, мы будем заменять кнопку на элементы, полученные при ajax запросе
  23.                 this.navBlock = this.element.find('.js-template-name-show-more');
  24.                 // наша кнопка "Показать ещё"
  25.                 this.pagen = this.element.find('.js-template-name-nav-ajax');
  26.                 // строим ссылку для запроса следующего набора элементов
  27.                 this.pagenGateway = this.buildPagenGatewayPath();
  28.                 // вешаем обработчик события на клик по кнопке
  29.                 this.on(this.pagen, 'click', 'showMoreEventStart');
  30.             },
  31.  
  32.             buildPagenGatewayPath : function() {
  33.                 var uri = new URI();
  34.  
  35.                 uri
  36.                     .setSearch('AJAX', 'Y')
  37.                     .setSearch('KEY', this.ajaxKey)
  38.                     .setSearch('PAGEN_'+this.pagen.attr('data-nav'), this.pagen.attr('data-page'))
  39.                     .toString();
  40.                 return uri;
  41.  
  42.                 // функция возвращает ссылку на страницу со следующим набором элементов и установленными ключами для доступа к компоненту по аякс
  43.             },
  44.  
  45.             showMoreEventStart : function() {
  46.                 // обработчик клика по кнопке
  47.                 // выполняем какие-либо действия, происходящие во время ожидания загрузки, если требуется
  48.                 this.pagenLoadState();
  49.                 // стираем обработчик события на клик по кнопке
  50.                 this.pagen.off();
  51.                 // запрашиваем аякс, проксируем функцию, которая выполнится при получении ответа
  52.                 $.get( this.pagenGateway, this.proxy('onShowMoreGatewayResponse'));
  53.             },
  54.  
  55.             pagenLoadState : function() {
  56.                 var pagen = this.pagen;
  57.                 // например, заменяем текст на кнопке "Показать ещё" на "Загрузка..."
  58.                 this.pagen.find('span').html('Загрузка...');
  59.             },
  60.  
  61.             onShowMoreGatewayResponse: function(data, status, xhqrObj) {
  62.                 // При получении ajax заменяем блок с нашей кнопкой на html ответа. Логично, если блок с кнопкой находится в одном родителе с текущим списком элементов на странице, то полученные элементы просто добавятся в конец списка. Так же, если в ответе будет новая кнопка на следующую страницу, то она вновь добавится в конец.
  63.                 this.navBlock.replaceWith(data);
  64.                 // Если в php шаблоне была конструкция для цикла элементов, для их классов <?if($isAjaxRequest):?>template-name-item--ajax<?endif;?>, то есть для запрошенных по аякс элементов добавляется модификатор класса --ajax, и правила стилей указывают, что элементы этого класса с таким модификатором скрыты (css>display:hide), то по окончании их загрузки они появятся с анимацией.
  65.                 this.element.find('.template-name-item--ajax').slideDown(330);
  66.                 // по окончании загрузки заново запускаем наш ajax пейджер, он будет готов к работе со следующей страницей, если в текущем ответе пришла новая кнопка "Показать ещё"
  67.                 this.initAjaxPagen();
  68.             },
  69.  
  70.         }
  71.     );
  72. }(jQuery));
Add Comment
Please, Sign In to add comment