将BackboneJs与jQuery Deferreds一起使用

时间:2012-03-29 18:34:24

标签: jquery backbone.js jquery-deferred

我正在使用我从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()对象。

1 个答案:

答案 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的简单绑定将以更清洁的方式完成相同的任务。