Javascript 使用Backbone.LayoutManager进行Dust.js模板渲染
让我详细介绍一下我的设置: 我已经预编译了dust.js模板,希望与Backbone.LayoutManager一起使用 Backbone.LayoutManager使用以下配置:Javascript 使用Backbone.LayoutManager进行Dust.js模板渲染,javascript,backbone.js,coffeescript,Javascript,Backbone.js,Coffeescript,让我详细介绍一下我的设置: 我已经预编译了dust.js模板,希望与Backbone.LayoutManager一起使用 Backbone.LayoutManager使用以下配置: Backbone.LayoutManager.configure manage: true fetch: (name) -> name 所以模板的名称直接通过fetch传递到render,我想像这样覆盖render: render: (template, context) -> do
Backbone.LayoutManager.configure
manage: true
fetch: (name) ->
name
所以模板的名称直接通过fetch传递到render,我想像这样覆盖render:
render: (template, context) ->
done = @async
dust.render @template, context, (err, out) ->
throw err if err
done(out)
但是我不能用render来实现这一点(大概是因为LayoutManager作者假设模板呈现是同步的)
有人知道我如何做到这一点吗?您需要修改LayoutManger以处理模板的异步呈现 实现这一点的方法之一是使用jQuery Deferred对象,其中对
render
的调用返回一个Deferred
对象的实例,然后在对Dust
库的调用中解析该实例
然后,修改Backbone.LayoutManager,在解析延迟对象之前,不要继续对模板执行它想要的操作
在渲染中
:
render: (template, context) ->
dfd = $.Deferred()
dust.render @template, context, (err, out) ->
throw err if err
done(out)
dfd.resolve()
return dfd;
然后,使用Backbone.LayoutManager中调用render的方法,而不是使用render的返回执行某些操作,而是将该“某物”附加到传递回的延迟处理程序的done
处理程序
dfd = render(template, context)
dfd.done(do_something_with_this_template);
我使用的是Marionette.js(以及它的异步变体)和dust,这就是我的核心render
方法的外观:
render: function(){
var dfd = $.Deferred();
var template_context = this.model;
if(_.isUndefined(template_context) || _.isFunction(template_context)){
template_context = new (Backbone.Model.extend({}));
}
if(this.id) this.$el.attr('id', this.id);
var that = this;
dust.stream(this.tpl_name, template_context.toJSON())
.on('data', function(data){
that.$el.html(data);
})
.on('end', function(){
dfd.resolve();
that.enable_menus();
that.trigger('template:rendered');
})
.on('error', function(err){
dfd.reject();
window.le(err.message, err);
that.trigger('template:error');
});
return dfd;
}
(显然也没有使用coffeescript…嘿,伙计们,这只是一个快速更新。主干布局管理器支持从v0.7.1开始的模板异步呈现:)