Backbone.js:使用一个请求加载多个集合

时间:2012-09-06 08:44:38

标签: javascript backbone.js

此时我的代码分别获取每个集合,但鉴于相同的请求是一起完成的,我希望它能在一个请求中加载集合。

如果我要合并所有内容,这就是我的请求响应:

[{id: 5, milestoneName: 'some milestone', tasks: [{id: 1, taskName: 'first task', dueDate: 'Jan 15'}, {id: 2, taskName: 'second task', dueDate: ''}]},{id: 6, milestoneName: 'some other milestone', tasks: [{id: 3, taskName: 'third task', dueDate: 'Jan 16'}, {id: 4, taskName: 'fourth task', dueDate: ''}]}]  

基本上,有些里程碑包含任务。此时,里程碑集合会获取里程碑,当它们被提取时,(每个里程碑的)任务集合被初始化并获取任务。这可能需要相当长的时间(2-3秒,很明显)。如果我可以在一个请求中加载它们,一切都会更快。

milestoneModel = Backbone.Model.extend({});

milestoneCollection = Backbone.Collection.extend({
  url: 'http://some-url',
  model: milestoneModel
});

taskModel = Backbone.Model.extend();

taskCollection = Backbone.Collection.extend({
  url: 'http://task-url',
  model: taskModel
});

我希望taskCollection成为每个milestoneModel的一部分,并在请求响应到达后立即重置。

1 个答案:

答案 0 :(得分:3)

阿。嵌套模型并将其全部取出。 :-)基本上,让您的服务器发送您正在发送的内容。嵌套任务集合的JSON结构很好。这是你做的。

在里程碑模型中,您修改解析以查找属性tasks,然后相应地处理它。例如:

parse: function(response) {
    if (_.has(response, 'tasks')) {
        if (this.tasks) {  // Check if this model has a tasks collection already defined
            this.tasks.reset(response.tasks); // It does, so reset it with data
        } else {
            this.tasks = new taskCollection(response.tasks); // It doesn't, so create one
        }
        delete response.tasks;
        // Don't forget to delete tasks from response or it will be passed onto the model
        // set and appear in your attributes
    }
    return response;  // Do pass on all the other attributes that belong to the model
}

这假设您希望taskCollection作为Milestone模型的属性而不是属性。它基本上检查任务数组是否作为响应的属性存在,如果有,我们检查模型对象是否已经定义了任务集合。如果是,请使用数据重置集合。如果没有,请使用数据创建集合。

还有一件事。我不确定你是否必须这样做。但我想当你fetch()你的里程碑集合时,你可能必须通过一个选项parse:true。当你需要这样做时,我会忘记,或者如果这是前一个Backbone的遗留物。尝试在解析中放置console.log()以检查您的Milestone模型是否正确解析响应。如果不是,请尝试传递parse:true选项。