Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save DragonI/6147082 to your computer and use it in GitHub Desktop.
Save DragonI/6147082 to your computer and use it in GitHub Desktop.
/*
* This decorates Handlebars.js with the ability to load
* templates from an external source, with light caching.
*
* To render a template, pass a closure that will receive the
* template as a function parameter, eg,
* T.render('templateName', function(t) {
* $('#somediv').html( t() );
* });
*
* Source: https://github.com/wycats/handlebars.js/issues/82
* Created by https://github.com/tedpennings
* gist: https://gist.github.com/utkarsh2012/2287070
* August 3, 2013 - DragonI - added path and extension to Template
*/
var Template = function(path, extension) {
this.cached = {};
this.path = path;
this.extension = extension;
};
var T = new Template('/handlebars/', '.hbs');
$.extend(Template.prototype, {
render: function(name, callback) {
if (T.isCached(name)) {
callback(T.cached[name]);
} else {
$.get(T.urlFor(name), function(raw) {
T.store(name, raw);
T.render(name, callback);
});
}
},
renderSync: function(name, callback) {
if (!T.isCached(name)) {
T.fetch(name);
}
T.render(name, callback);
},
prefetch: function(name) {
$.get(T.urlFor(name), function(raw) {
T.store(name, raw);
});
},
fetch: function(name) {
// synchronous, for those times when you need it.
if (! T.isCached(name)) {
var raw = $.ajax({'url': T.urlFor(name), 'async': false}).responseText;
T.store(name, raw);
}
},
isCached: function(name) {
return !!T.cached[name];
},
store: function(name, raw) {
T.cached[name] = Handlebars.compile(raw);
},
urlFor: function(name) {
return T.path + name + T.extension;
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment