我在backbone.js的项目中工作,我面临的问题是我有一个不需要与服务器同步的模型,这个模型唯一的目的是获取用户数据来初始化其余的视图,它是一个带有模型的应用程序的包装视图。
这个模型从多个urls中获取数据,而我的实际问题是视图在将所有数据赋值给模型之前(在某些情况下)是呈现的,而在其他情况下,当所有数据已经分配给模型时,视图正在呈现。
我使用$.when()来获取模型,并调用.done()来呈现视图,但我想我不理解延迟对象的概念。想知道你们有什么样的建议来解决这个问题。我给你留下一个例子,说明我的代码是怎样的。
模型
var userModel = Backbone.Model.extend({
url: "/api/vacationtypes.json",
defaults: {
userName: 'anonymous',
availableDays: 0,
vacationType: []
},
initialize: function() {
var that = this;
_.bindAll(this,'parseAvailableDays');
},
parse: function(data){
return {vacationType: data.data}
},
getAvailableDays: function() {
$.ajax({
url: "/api/staffAvailableDays/get/" + Zvacations.session.email + ".json",
success: this.parseAvailableDays
});
},
parseAvailableDays: function(response) {
this.set('availableDays', response.data[0].availableDays);
}
});
视图
var Home = Backbone.View.extend({
tagName: "section",
className: "home",
el: "#request-form"
events: {
// events for the view
},
initialize: function(){
var that = this;
this.setPageTitle('Home');
this.model.on('change:availableDays', this.render, this);
// once all fetches for model are done render the view (sometime execute before the succes of getAvailableDays)
$.when( this.model.fetch(), this.model.getAvailableDays() ).done(function(){
that.render();
});
},
render: function(){
var template = _.template(homeViewTemplate, this.model.toJSON());
this.$el.html(template);
// get holydays from db
this.getHolidays();
//assign total steps after render
this.totalSteps = $(homeViewTemplate).find('fieldset').length
// initialize jQuery UI datepicker
this.dateSelectorView();
return this;
},
// here goes rest of the view methods
});
希望你们能帮我弄清楚哪一种方法是最好的等待,直到所有的抓取完成渲染。
发布于 2014-10-01 20:01:33
您需要从jqXHR
返回getAvailableDays
(ajax返回值),以便它可以与$.when
一起使用。
getAvailableDays: function() {
return $.ajax({
url: "/api/staffAvailableDays/get/" + Zvacations.session.email + ".json",
success: this.parseAvailableDays
});
},
现有代码将getAvailableDays
和fetch
的返回值传递给$.when
。当您不从getAvailableDays
返回任何内容时,您的代码相当于以下内容:
$.when(this.model.fetch(), undefined).done(function() {
that.render();
});
它忽略了getAvailableDays
中的ajax调用。
来自jQuery文档:
如果将单个参数传递给jQuery.when(),并且它不是延迟的或承诺的,则它将被视为已解决的延迟推断,任何附加的doneCallbacks都将立即执行。
在主干内部,您会发现fetch
从ajax调用返回jqXHR对象,类似于您应该如何处理getAvailableDays
。
https://stackoverflow.com/questions/26149281
复制相似问题