Рассмотрите фрагмент HTML, например, содержащий серию заполнителей (содержащихся в отдельных фигурных скобках).Замена заполнителей в HTML-фрагменте
<div>
{ user.name }
{ user.username }
{ user.address.line1 }
{ user.address.line2 }
</div>
и объект JavaScript, который выглядит следующим образом:
var user = {
name: 'Bob Foo',
username: 'bobfoo',
address : {
line1: '10 Foo Street',
line2: 'Footown'
}
};
Какой самый лучший способ заменить заполнители эквивалентными переменными? Я ценю, что это базовая форма шаблонов, но я не хочу, чтобы зависимость сторонних сторон от рулей или аналогичных. Я также не хочу добавлять какие-либо особенности к шаблону, кроме самих заполнителей. Изменение разделителя-заполнителя на что-то другое было бы хорошо, если бы возникла определенная потребность в таком столкновении с другой библиотекой.
Это фрагмент JS из большего файла, который мы используем для разбора заполнителей. Он отлично работает, но я не уверен, что это хорошая практика, это, безусловно, не особенно элегантно! Само собой разумеется, мы хотим сделать это, не используя eval()
, поскольку источником данных является стороннее лицо.
var template = $(self.options.templateId).html();
for (var k in user) {
if (!user.hasOwnProperty(k)) continue;
if(k == 'address'){
for (var k in user.address) {
if (!user.address.hasOwnProperty(k)) continue;
var needle = "{ user.address." + k + " }";
template = template.replace(needle, user.address[k]);
}
}else{
var needle = "{ user." + k + " }";
template = template.replace(needle, user[k]);
}
}
Это часть плагина jQuery, поэтому любой конкретный код jQuery в порядке.
Благодаря
Вы можете проверить, что [underscore.js] (HTTP: // underscorejs.org/) делает под капотом, потому что его система шаблонов является самой минимальной [но функциональной], которую я когда-либо видел. – moonwave99