Храните шаблон jsRender в отдельном файле js
Можно ли сохранить шаблон jsRender в отдельном файле?
Я хочу сохранить его в отдельном файле и сделать ссылку на него на моей странице.
что-то вроде этого
<script id="templateName" type="text/x-jsrender" src="thisIsTheTemplate.js"></script>
Я буду оценивать любые коммниты или предложения.
Спасибо
Ответы
Ответ 1
Да, вы можете это сделать (я использую это каждый раз).
предположим, что у вас есть ваши шаблоны в папке template
и вызывается, например _productDetails.tmpl.html
на вашей странице вы используете jQuery $.get()
, чтобы вытащить его и загрузить в шаблон, например:
var renderExternalTmpl = function(item) {
var file = '../templates/_' + item.name + '.tmpl.html';
$.when($.get(file))
.done(function(tmplData) {
$.templates({ tmpl: tmplData });
$(item.selector).html($.render.tmpl(item.data));
});
}
и вы передаете объект item
witch будет содержать все 3 свойства, например:
renderExternalTmpl({ name: 'productDetails', selector: '#items', data: {} })
У вас может быть класс утилит, чтобы сохранить все это:
var my = my || {};
my.utils = (function() {
var getPath = function(name) {
return '../templates/_' + name + '.tmpl.html';
},
renderExtTemplate = function(item) {
var file = getPath( item.name );
$.when($.get(file))
.done(function(tmplData) {
$.templates({ tmpl: tmplData });
$(item.selector).html($.render.tmpl(item.data));
});
};
return {
getPath: getPath,
renderExtTemplate: renderExtTemplate
};
});
и вы можете легко вызвать my.utils.renderExtTemplate(item);
Ответ 2
Недавно я столкнулся с этой проблемой. Просмотрев код jsRender и изучая другие библиотеки javascript, я решил написать свою собственную библиотеку, которая упростит загрузку внешних шаблонов, чтобы можно было прикрепить шаблоны к странице html с помощью тега <link>
и сделать их просто включив. js файл. Если вы хотите проверить это, я отправил код на github с примерами:
https://github.com/stevenmhunt/tmpl.loader
Эта библиотека работает с jsRender, а также с любым кодом, способным обрабатывать шаблон.
Наслаждайтесь!
Ответ 3
Если вы пытаетесь загрузить внешние шаблоны из локального файла, как и я, позвольте мне сэкономить вам некоторое разочарование.
Не используйте jQuery $.get()
, как рекомендовано в ответе balexandre.
Используйте $.ajax()
и установите async: true
и dataType: text
, в противном случае вы получите сообщение об ошибке: elem.getAttribute is not a function
.
Подробнее см. Мой ответ на Ошибка при загрузке шаблонов jsrender через AJAX.
Ответ 4
Вот функция, которую я написал для загрузки одного или нескольких внешних шаблонов сразу. Он также кэширует шаблоны, поэтому, если он уже загружен, он больше не загружается.
function loadTemplates() {
var toLoad = [],
loadAll = $.Deferred();
$.each(arguments, function(i, templateName) {
var filepath = '/path/to/templates/' + templateName + '.html',
loadTemplate = $.Deferred();
toLoad.push(loadTemplate);
if ($.templates[templateName]) {
loadTemplate.resolve();
} else {
$.get(filepath , function(html) {
var newTemplate = {};
newTemplate[templateName] = html;
$.templates(newTemplate);
}).fail(function() {
throw 'Could not load template at '+filepath;
}).done(function() {
loadTemplate.resolve();
});
}
})
$.when.apply($, toLoad).done(function() {
loadAll.resolve();
});
return loadAll;
}
Используйте его так:
loadTemplates('modal','itemDetail', 'itemsList').done(function() {
// do stuff when all templates are loaded
$('#viewItemDetail').on('click',function() {
$.render.itemDetail({
id:'123',
name:'Cool Thing',
description:'This thing is really cool.'
});
});
});
Ответ 5
по моему опыту, вам не нужно работать с этой проблемой, вам просто нужно добавить шаблон на страницу, прежде чем использовать ее. см. ниже код.
<div id="all_template"></div>
<script>
var file = '/tmpl/all.tmpl.html';
$.ajax({
url: file,
async: false,
type : "GET",
dataType: 'text',
cache: true,
success: function(contents)
{
$("#all_template").append(contents);//append all your template to the div
}
});
</script>
<script>
var data = {};
$('#js-template').render(data);//use it as the same old way
</script>
таким образом, вам не нужно запрашивать файл ajax каждый раз, когда вы хотите отобразить шаблон js