您需要修改 LayoutManger 以处理模板的异步呈现。
执行此操作的方法之一是使用 jQuery Deferred 对象,其中调用render
返回对象的实例,然后您在对库Deferred
的调用中解析该实例。Dust
然后,修改 Backbone.LayoutManager 以不继续使用模板做它想做的事情,直到该 Deferred 对象被解析。
在render
:
render: (template, context) ->
dfd = $.Deferred()
dust.render @template, context, (err, out) ->
throw err if err
done(out)
dfd.resolve()
return dfd;
然后,您采用 Backbone.LayoutManager 中调用渲染的方法,而不是对渲染的返回做某事,而是将该“某事”附加到done
您传回的延迟的处理程序。
dfd = render(template, context)
dfd.done(do_something_with_this_template);
我正在使用 Marionette.js(以及它的异步变体)和灰尘,这就是我的核心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;
}
(显然也不使用咖啡脚本......)