Как получить доступ к атрибутам данных в предварительной обработке Framework7

Я загружаю динамические страницы с препроцессом F7 и T7. У меня возникли трудности с доступом к идентификатору продукта, хранящемуся в атрибуте данных. Дело в том, что я хочу, когда пользователь нажимает на продукт в каталоге продуктов; страница сведений загружается с подробной информацией о выбранном продукте. Но всякий раз, когда я пытаюсь это сделать, я получаю неопределенное значение для var id. вот мой код:

HTML show.html

{{#each this}}
       <div class="content-block"><!--Block Content-->
         <div class="row"> <!--Block Content row-->
               <div class="col-25">
                  <a href="show.html" class="link" data-id={{id}}>
               <div class="item-media"><img src="{{product_image}}" width="100" height="100"></div>
            </a>
               <h3>{{product_name}}</h3>
                  <div class="chip"> 
             <div class="chip-label">KES.{{price}}</div> 
                        </div>
               <p>{{product_desc}}</p>
               <div class="row">
                  <div class="col-50">
                     <a href="#" class="button button-small button-fill color-blue">Add to Cart</a></div> 


                   <div class="col-50">

                     <a href="#" class="button button-small button-fill color-gray">Add to Wishlist</a></div> 
                  </div>
                  </div>             

myApp.js

var myApp = new Framework7({

        template7Pages: true, // enable Template7 rendering for Ajax and Dynamic pages
         animateNavBackIcon: true,
           // Enabled rendering pages using Template7
   template7Pages: true,
  precompileTemplates: true,

    preprocess: function (content, url, next) {
      var rootUrl = 'http://localhost/phonestore/public/api/';
      switch(url)
      {
case 'show.html':
         var id = $$(this).attr('data-id');
       //alert(id) returns undefined


         //Fetch product categories and display them in list box
         var serverUrl = rootUrl+'products/'+id;
         $$.ajax({
    url: serverUrl,
    dataType: "json",
    success: function (data, textStatus, jqXHR) {

   var compiled = Template7.compile(content);
            next(compiled(data));


    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert("ERROR: " + errorThrown)
    }
});

         break;
.....
}
}

Все данные приходят с сервера. Как я могу получить атрибут идентификатора продукта в предварительной обработке. Пожалуйста помогите.


person wafutech    schedule 22.01.2018    source источник
comment
data-id является атрибутом в файле `show.html`?   -  person Djiggy    schedule 22.01.2018
comment
Да, это атрибут в show.html. Я только что отредактировал сообщение, чтобы указать это.   -  person wafutech    schedule 22.01.2018
comment
Спасибо за точность. Еще одна вещь, у вас нет двух страниц? (1 для списка, один для подробностей)   -  person Djiggy    schedule 23.01.2018
comment
На странице каталога товаров перечислены все товары. когда пользователь нажимает на миниатюру продукта, он переходит к show.html с полной информацией о нажатом элементе.   -  person wafutech    schedule 23.01.2018


Ответы (2)


Документация F7 говорит о preprocess:

Framework7 позволяет вам использовать ваш любимый механизм шаблонов на стороне клиента или вносить любые изменения в загруженный контент.

Вам не нужно проходить предварительный процесс, чтобы сделать это.

Во-первых, удалите href для тега a и добавьте его в класс (например, go-detail)

Затем добавьте прослушиватель событий в элементы списка:

$$('.content-block a.go-detail').on('click', function(event) {
    var itemId = $$(event.target).attr('data-id');
    //do ajax call to retrieve data and load show.html page !
});

Я думаю, что это более простое решение, чем использовать метод preprocess.

person Djiggy    schedule 23.01.2018
comment
Спасибо за ответ. Однако удаление атрибута href из элементов ‹a› делает их неактивными. Я также сохранил атрибут href с #, но все же щелчок по миниатюре не вызывает никаких событий. Консоль не показывает ошибок. ‹div class=content-block›‹!--Блокировать содержимое--› ‹div class=row› ‹!--Блокировать строку содержимого--› ‹div class=col-25› ‹a href=# class=go- подробный data-id={{id}}› ‹div class=item-media›‹img src={{product_image}} width=100 height=100›‹/div› ‹/a›....... .. - person wafutech; 24.01.2018
comment
Также я не уверен, как я перейду с сервера на show.html, используя этот метод, если он работает. Похоже, что только предварительная обработка поддерживает данные сервера. - person wafutech; 24.01.2018
comment
1) Да, вы должны сохранить атрибут href со значением # 2) В противном случае сохраните логику предварительной обработки. Вам нужно просто сохранить data-id в глобальной переменной, чтобы получить ее в предварительной обработке. - person Djiggy; 25.01.2018

вы можете использовать этот подход: заполнение var trashIcon и composeIcon:

app.on('pageInit', function (e, page) {
                var ios = this.theme.ios;
                var trashIcon = ios ? '<i class="icon f7-icons">trash</i>' : '<i class="icon material-icons">delete</i>';
                var composeIcon = ios ? '<i class="icon f7-icons">compose</i>' : '<i class="icon material-icons">edit</i>';
            });

и для загрузки этих переменных JavaScript: не используйте {{trashIcon}}, а используйте + trashIcon +

$.each(bookingsData, function (index, onedata) { bookingdatahtml = bookingdatahtml + '<tr>' + '<td class="actions-cell"><a class="link icon-only" onclick="EditThis(' + onedata.bookings_id + ')" href="javascript:void(0)">' + composeIcon + '</a>' + '<a class="link icon-only" onclick="DeleteThis(' + onedata.bookings_id + ')" href="javascript:void(0)">' + trashIcon + '</a>' + '</td >' + '</tr>' }); $$('#showBookingbyUserId').html(bookingdatahtml);

person Md. Sultanul Arefin    schedule 11.02.2018