Повторно отображать шаблон Dust.js с новыми данными

Что было бы наилучшим способом повторного рендеринга шаблона пыли, когда он перемещался в файле данных, ссылаясь на него, а не просто повторял каждый раз с самого начала. Например:

Скажем, у меня есть список из 100+ людей, которые хранятся в формате JSON в переменной data:

{
    "people": [
        {
            "name": "Jerry",
            "age": "17"
        },
        {
            "name": "Darcy",
            "age": "19"
        },
        {
            "name": "Jacob",
            "age": "25"
        },
        ... and so on for 100 or so people
    ]
}

И у меня есть этот файл template.tl, который экспортирует строку из трех имен / возрастов:

<div class="row">
    <div>{name} - {age}</div>
    <div>{name} - {age}</div>
    <div>{name} - {age}</div>
</div>

Который я прекомпилирую в template.js:

(function(){dust.register("template.tl",body_0);function body_0(chk,ctx){return chk.write("<div class=\"row\"><div>").reference(ctx.get(["name"], false),ctx,"h").write(" - ").reference(ctx.get(["age"], false),ctx,"h").write("</div><div>").reference(ctx.get(["name"], false),ctx,"h").write(" - ").reference(ctx.get(["age"], false),ctx,"h").write("</div><div>").reference(ctx.get(["name"], false),ctx,"h").write(" - ").reference(ctx.get(["age"], false),ctx,"h").write("</div></div>");}return body_0;})();

Тогда у меня есть файл index.html, который выглядит следующим образом:

<html>
    <head>
    ...
    </head>

    <body>
        <div id="people"></div>

        <button id="load-more" type="button">Load More</button>
    </body>

    <script src="js/dust-core.min.js"></script>
    <script src="js/template.js"></script>
</html>

Что было бы наилучшим способом сделать так, чтобы каждый раз, когда нажималась кнопка, внутри <div id="people"></div>и каждый последующий щелчок будет загружать следующие три / test для конца массива данных (можно предположить, что количество людей всегда кратно трем для моих нужд).

1 ответ

Решение

Измените template.tl на:

<div class="row">
    {#.}
        <div>{.name} - {.age}</div>
    {/.}
</div>

Есть 2 преимущества для изменения шаблона:

  • Вы можете пройти в любое количество people объекты, а не только 3.
  • Если в массиве осталось только 2 элемента, он все равно будет отображаться правильно.

JavaScript для выполнения рендеринга:

$('#load-more').on('click', function(){
    var next3 = data.people.splice(0, 3);

    if(next3.length == 0){
        return; // Array is empty
    }

    dust.render('template.tl', next3, function(err, str){
        if(str){
            $('#people').append(str);
        }
    });
});

Самая важная часть data.people.splice(0, 3)это удаляет 3 элемента из массива и возвращает их - см. Array.prototype.splice ().

Остальная часть кода - это просто JQuery для добавления прослушивателя событий и вставки визуализированного шаблона.

JSFiddle

Другие вопросы по тегам