Handlebars: Подгрузка и шаблонизация JSON

  • вторник, 6 сентября 2016 г. в 11:06:21

После написания предыдущей статьи о популярных фреймворках и языках программирования 2016 года, начал изучать фреймворки и библиотеки. В первую очередь начал с Underscore.js, отличная библиотека, выполняет многие повседневные задачи для работы с массивами, объектами и функциями.

Советую посмотреть про эту библиотеку или почитать предыдущую статью. А сейчас, я работаю с JavaScript шаблонизатором Handlebars.js. Ранее, я работал с шаблонизатором Angular.js и разобраться с Handlebars.js было не трудно.

Очень понятная система шаблонизации и создания хелперов. Думаю, даже начинающим не будет трудно разобраться с данным шаблонизатором. Советую посмотреть, не пожалеете.

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

В первую очередь, скачаем Handlebars.js и jQuery и подключим перед </body>:


_10
<script src="handlebars.min.js"></script>
_10
<script src="jquery.min.js"></script>
_10
<!--
_10
CDN: <script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.min.js"></script>
_10
CDN: <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
_10
-->

Далее, создаем небольшой HTML шаблон который и будет применяться для компиляции. Но, чтобы браузер мог работать с этим шаблоном, требуется установить тип text/x-handlebars-template и установить ID или class, для дальнейшей работы с данным шаблоном. Мы будем использовать ID = template


_25
<!DOCTYPE html>
_25
<html lang="en">
_25
<head>
_25
<meta charset="UTF-8">
_25
<title>Hadlebars - Подгрузка и шаблонизация JSON</title>
_25
</head>
_25
<body>
_25
_25
<ul class="persons">
_25
<script id="template" type="text/x-handlebars-template">
_25
{{#each person}}
_25
<li>
_25
<h2>{{this.firstName}} {{this.lastName}}, {{this.age}} лет.</h2>
_25
</li>
_25
{{/each}}
_25
</script>
_25
</ul>
_25
_25
<button>Get AJAX</button>
_25
_25
<script src="handlebars.min.js"></script>
_25
<script src="jquery.min.js"></script>
_25
<script src="script.js"></script>
_25
</body>
_25
</html>

Ваш шаблон, который будет в дальнейшем компилироваться, вставляется в <script> с указанием типа text/x-handlebars-template. Далее, с помощью each, шаблонизатор будет обрабатывать каждую запись из массива объектов data. С помощью this мы обращаемся к каждому свойству объекта через точку.

И так, шаблон готов. Теперь требуется создать script.js, который будет компилировать массив data JSON объектов в HTML код.

script.js


_21
var data = {
_21
persons: [
_21
{"firstName": "Саша", "lastName": "Васильев", "age": "20"},
_21
{"firstName": "Вася", "lastName": "Пупкин", "age": "32"},
_21
{"firstName": "Рустам", "lastName": "Парчиев", "age": "18"}
_21
]
_21
};
_21
_21
$(document).ready(function(){
_21
_21
var template = Handlebars.compile( $('#template').html() );
_21
$('.persons').append( template(data) );
_21
_21
$('button').click(function(){
_21
$.getJSON('new_persons.json',function( data ){
_21
template = Handlebars.compile( $('#template').html() );
_21
$('.persons').append(template(data));
_21
});
_21
});
_21
_21
});

Как вы заметили, есть еще обработчик событий .click() на <button>. С помощью этого обработчика, мы отправляем GET запрос на сервер, на получение JSON файла нового списка персон.

После чего, с помощью метода .compile() обработаем наш шаблон который в <script> и добавляем в ul.persons (ul список с классом .persons) новых персон из JSON файла.

new-persons.json


_10
{
_10
"people": [
_10
{"firstName": "Алексей", "lastName": "Кукурузов", "age": "25"},
_10
{"firstName": "Archakov", "lastName": "Im", "age": "20"},
_10
{"firstName": "Hello", "lastName": "World", "age": "100500"}
_10
]
_10
}

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


_13
function templateJSON(url, hbid, callback){
_13
$.getJSON(url, function( json ){
_13
template = Handlebars.compile( $(hbid).html() );
_13
if (callback) callback(template, hbid);
_13
});
_13
}
_13
_13
templateJSON('new-persons.json', '#template', function(template){
_13
_13
template = Handlebars.compile( $('#template').html() );
_13
$('.persons').append(template(data));
_13
_13
});

Вот ссылка handlebars-load-and-templating-json.zip на полный пример со всеми файлами. И демо ниже.

Демо

#handlebars#ajax#json#templating#шаблонизация