Reputation: 2751
Is it possible to store a jsRender template in a separate file?
I want to store it in a separate file and make a reference of it in my page.
something like this
<script id="templateName" type="text/x-jsrender" src="thisIsTheTemplate.js"></script>
I will apreciate any commemnts or suggestions.
Thanks
Upvotes: 18
Views: 11630
Reputation: 2790
Here is a function I wrote to load one or more external templates at once. It also caches the templates so if one is already loaded it won't load again.
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;
}
Use it like so:
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.'
});
});
});
Upvotes: 2
Reputation: 1
in my experience, you don't need to work with that trouble, you just need to append the template to the page before you using it. see below code.
<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>
in this way, you don't need to request a ajax file everytime you want to render a js template
Upvotes: 0
Reputation: 2321
I recently ran into this problem myself. After looking through the jsRender code, and studying other javascript libraries, I decided to write my own library that would simplify loading external templates so that one could attach templates to a html page using the <link>
tag and render them by simply including the .js file. If you would like to check it out, I have posted the code on github with examples:
https://github.com/stevenmhunt/tmpl.loader
This library works with jsRender, as well as any code capable of processing a template.
Enjoy!
Upvotes: 2
Reputation: 1115
In case you're trying to load external templates from a local file, like I was, let me save you some frustration.
Don't use the jQuery $.get()
as recommended in balexandre's answer.
Use $.ajax()
, and set async: true
and dataType: text
, otherwise it gives you an error: elem.getAttribute is not a function
.
See my answer to Error when loading jsrender templates through AJAX for details.
Upvotes: 1
Reputation: 75073
Yes, you can accomplish this (I use this every time).
let's assume that you have your templates in a template
folder and it is called, for example _productDetails.tmpl.html
in your page you use jQuery $.get()
to pull it and load into the template, like:
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));
});
}
and you pass an object item
witch will contain all 3 properties, like:
renderExternalTmpl({ name: 'productDetails', selector: '#items', data: {} })
You can have a nice utilities class to hold all this:
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
};
});
and you can easily call my.utils.renderExtTemplate(item);
Upvotes: 21