我正在使用主干样板来呈现我的模板,它的 fetchTemplate 方法缓存了呈现的模板。
我想在渲染的内容上运行一些额外的代码,比如初始化手风琴等,但是使用异步编译的模板来做到这一点比我想象的要棘手。
这是一个例子:
Duel.Views.Home = Backbone.View.extend({
template: "/templates/duel_home.jade",
render: function() {
var view = this;
statusapp.fetchTemplate(this.template, function(tmpl) {
$(view.el).html( tmpl({duels: view.collection.toJSON()}) );
view.postrender();
});
return this;
},
postrender: function() {
$('#duel-new').each(function() {
console.log('Found something')
});
}
});
这我做类似的事情
var view = Duel.Views.Home({model: mymodel})
viewHandler('#content').showView(view)
这叫
$('#content').html(view.render().el)
但是发生的情况是,当模板还没有缓存时,先调用render,然后按时调用postrender。另一方面,当模板已经被缓存时,模板被立即渲染,postrender 被调用,但view.el
还没有插入到 DOM 中,因此 $(this.el) 是一个空列表,并且 $('#duel -new').each() 是“无效的”。
当然,我可以在 viewHandler 的 render 调用之后添加 postrender 方法,但这会导致相同的问题,但在第一次调用 render 方法时。由于模板尚未编译,postrender 在其元素存在之前被调用,因此无法在这些不存在的元素上定义处理程序。
关于如何正确克服这个问题的任何想法?例如,使用 .on 的简单点击事件相对简单,但是更一般的结构$('#tabs').tabs()
呢?例如?
我的 fetchTemplate 函数如下:
fetchTemplate: function(path, done) {
window.JST = window.JST || {};
// Should be an instant synchronous way of getting the template, if it
// exists in the JST object.
if (JST[path]) {
return done(JST[path]);
}
// Fetch it asynchronously if not available from JST
return $.get(path, function(contents) {
var tmpl = jade.compile(contents,{other: "locals"});
JST[path] = tmpl;
return done(tmpl);
});
},