I'm trying to write a function that will give me a compiled handlebars template (I have all my templates in separate files) using an ajax call to get the template and compile it for use, but I need to use a promise so I can actually use it.
function getTemplate(name){
$.get('/'+name+'.hbs').success(function(src){
var template = Handlebars.compile(src);
//can't return the template here.
});
}
How do I do this with promises so I can do something like:
$("a").click(function(e){
getTemplate('form').done(function(template){
$("body").append(template({
name: "My Name"
})
);
});
});
I created a library to help with this kind of issue, check at github
You only have to add this to your main app view:
put this into your MainApp
and them, for instance, to open a modal with the template that you want, you only have to:
And not forget to add the FactoryController and RepositoryController
Following adds a data argument to the
getTemplate
function as well as template name.DEMO
Chovy, I see you have accepted an answer but you might be interested to know that
getTemplate
can, by chaining.then()
rather than.success()
, be written almost as in the question :or, adopting charlietfl's idea to pass in data and return a Promise of a fully composed fragment :
The nett effect is identical to charlietfl's version of
getTemplate
but.then()
makes it unnecessary to create a Deferred explicitly. The code is thus more compact.