Повторно отображать шаблон 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 для добавления прослушивателя событий и вставки визуализированного шаблона.