Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js:通过一个请求加载多个集合_Javascript_Backbone.js - Fatal编程技术网

Javascript Backbone.js:通过一个请求加载多个集合

Javascript Backbone.js:通过一个请求加载多个集合,javascript,backbone.js,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: 'so

此时,我的代码分别获取每个集合,但由于相同的请求是一起发出的,我希望它在一个请求中加载集合

如果我要合并所有以下内容,则我的请求-响应将是这样的:

[{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
的一部分,并在该请求响应到达后立即重置。

啊。嵌套模型并将其全部提取。:-)基本上,让你的服务器发送你要发送的内容。嵌套任务集合的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作为里程碑模型的属性,而不是属性。它基本上检查任务数组是否作为响应的属性存在,如果存在,我们检查模型对象是否已经定义了tasks集合。如果是,则使用数据重置集合。如果不是,则使用数据创建集合


还有一件事。我不确定你是否必须这样做。但我认为,当您
fetch()
里程碑集合时,可能需要传递一个选项
parse:true
。我有点忘了什么时候你需要这么做,或者这是以前的脊梁骨遗物。尝试在解析中放置一个console.log(),以检查里程碑模型是否正确解析响应。如果不是,则尝试传递
parse:true
选项。

我已经重写了另一个集合的
parse
函数,它不需要
parse:true
。不过我会注意的。谢谢你今天简化了这个。无
parse:true
是必需的:)工作完美!