我正在使用我从Sam Breed读到的关于在Backbone中使用Deferreds的技术。
在我的主干initialize
的{{1}}方法中,我有以下内容:
View
这将为我加载一个位于var me = this;
this.deferredTemplate = $.ajax({
url: 'details/welcomeMaster.htm'
}).done(function (data) {
me.template = data;
});
外部的模板文件。
然后,当我需要它时,这是新代码的代码。
View
不幸的是,我必须分解这两个语句,以便var something = new Dashboard.Views.WelcomeMasterView({
collection: me.collection,
el: $('.contentContainer')
});
something.deferredTemplate.done(function (data) {
something.render();
});
是我的Backbone something
而不是jqXHR对象。除此之外,这段代码工作正常。
问题
关于如何将上述两个电话连接在一起的任何想法?在View
方法中,我需要Backbone .done()
对象。
答案 0 :(得分:4)
我认为如果你想保持简单,你可能更愿意先加载模板,然后在获取后构建任何视图。这就是AMD装载机提供同样功能的方式。
否则,一个想法是添加一个_render
来执行render
通常所做的事情,比如说
_render: function () {
this.$el.html(this.template(this.model.toJSON()));
},
然后,您的正常render
会在准备好后致电_render
:
render: function () {
this.deferredTemplate.done(this._render);
return this;
},
这会让事情变得简单,你可以像往常一样继续打电话给render()
。但请注意缺点:如果您依赖于在调用渲染后实际渲染(例如,您操纵其他地方的$el
),那么您可能实际上没有该元素。
作为旁注,虽然延迟是Backbone的完美契合,但是在链接到的博客文章中使用它们是不必要的。对change
的简单绑定将以更清洁的方式完成相同的任务。