Handlebars — данные не отображаются вообще

#javascript #jquery #handlebars.js

#javascript #jquery #handlebars.js

Вопрос:

Всем привет,

Я играл с handlebars, пытаясь заставить его работать в моем проекте, но я продолжаю получать никаких результатов при тестировании страницы.

Я использую данные JSON, которые я получил с другой страницы. Эти данные должны отображаться после компиляции шаблона. Но на самом деле ничего не происходит, я просто не получаю никаких результатов вообще.

get_items_data.js

 var source = $("#mytemplate").html(); 
var template = Handlebars.compile(source); 

    var Items = Array();
    getting_items_data = true;
    $.get('GetItemsData',function(responseJson) {
        if(responseJson!=null){
            $.each(responseJson, function(key,value) { 
                Items.push({ "id": value['item_id'], "blabla": "bla" });
            });
        }
    });
    $('body').append(template(Items));
  

test.jsp

 <script id="mytemplate" type="text/x-handlebars-template"> 
<table>
    <thead> 
        <th>Items</th> 
    </thead> 
    <tbody> 
        {{#each this}} 
        <tr> 
            <td>{{id}}</td> 
            <td>{{blabla}}</td> 
        </tr> 
        {{/each}} 
    </tbody> 
</table> 
</script>
  

Формат данных JSON:

 [{"ItemID":74,"SectionID":4},{"ItemID":78,"SectionID":4}]
  

Есть идеи, что здесь может быть не так?

Комментарии:

1. Попробуйте эту структуру jsfiddle.net/chridam/XL5sL переместив вашу логику LoadItems из шаблона сценария handlebars.

2. по какой-то причине это не работает при оценке массива в $.get() .

Ответ №1:

Похоже, что ваша шаблонная функция вызывается до того, как вы возвращаете данные, поэтому Items массив пуст, когда элементы добавляются в DOM. В отличие от AngularJS, Handlebars является статическим шаблоном, поэтому он не обновит DOM, если вы обновите массив позже.

Попробуйте переместить эту логику рендеринга в обратный вызов get :

 $.get('GetItemsData',function(responseJson) {
    if(responseJson!=null){
        $.each(responseJson, function(key,value) { 
            Items.push({ "id": value['item_id'], "blabla": "bla" });
        });
        $('body').append(template(Items));
    }
});
  

Комментарии:

1. Я только что протестировал это… и похоже, что этот джентльмен прав. Теперь это работает как шарм. Спасибо вам всем за помощь в решении этой проблемы.

2. @Wracker Это, по сути, то же самое, что я делал в своей второй скрипке: jsfiddle.net/whDqv/1 Я смоделировал ваше get использование setTimeout , чтобы сделать его асинхронным. Вам действительно нужно понять, почему он ломался, чтобы не повторять ту же ошибку снова.

Ответ №2:

$(document).ready(function() {
LoadItems();
});

Никогда не будет выполняться внутри скрипта типа text / x-handlebars-template.

Также может возникнуть проблема с вашими переменными, пытающимися получить значения из dom до его загрузки.

Вот упрощенная версия, которая работает: http://jsfiddle.net/whDqv /

 function LoadItems()
{
    var source = $("#mytemplate").html(); 
    var template = Handlebars.compile(source);
    var Items = Array();
    getting_items_data = true;
    Items.push({ "id": 1, "blabla": "bla" });
    var template = Handlebars.compile(source); 
    $('body').append(template(Items));

}

$(document).ready(function() {
    LoadItems();
});
  

Комментарии:

1. Попытался удалить это, но это тоже не помогло.

2. Удаление @Wracker также не сработает, вам нужно поместить его в отдельный тег скрипта под шаблоном. Я попытаюсь воссоздать это в jsfiddle.

3. Я знаю, что вы имеете в виду, но все равно это не работает. Я обновил свой первый пост, чтобы вы могли видеть, как он выглядит сейчас.

4. @Wracker Я отредактировал свой ответ. Мой простой пример работает нормально.

5. ваш пример действительно работает, однако он не работает, когда я пытаюсь добавить больше элементов в массив при циклическом просмотре данных JSON. .