Javascript 带有集合的Backbone.js模型
我有两个模型和一个系列Javascript 带有集合的Backbone.js模型,javascript,ajax,json,backbone.js,Javascript,Ajax,Json,Backbone.js,我有两个模型和一个系列JobSummary是一个模型,JobSummaryList是JobSummary项的集合,然后我有一个JobSummarySnapshot模型,其中包含一个JobSummaryList: JobSummary = Backbone.Model.extend({}); JobSummaryList = Backbone.Collection.extend({ model: JobSummary }); JobSummarySnapshot = Backbone.
JobSummary
是一个模型,JobSummaryList
是JobSummary
项的集合,然后我有一个JobSummarySnapshot
模型,其中包含一个JobSummaryList
:
JobSummary = Backbone.Model.extend({});
JobSummaryList = Backbone.Collection.extend({
model: JobSummary
});
JobSummarySnapshot = Backbone.Model.extend({
url: '/JobSummaryList',
defaults: {
pageNumber: 1,
summaryList: new JobSummaryList()
}
});
当我在jobsummarysapshot
对象上调用fetch
时,它会获取所有内容。。。除了在摘要列表
集合中移动外,它们都是对象
类型,而不是作业摘要
我认为这是有意义的,因为除了默认值
对象之外,它不知道摘要列表
应该是作业摘要列表
类型。我可以浏览每个项目并将其转换为JobSummary
对象,但我希望有一种方法可以不用手动完成
以下是我的测试代码(工作):
更新:
我突然想到我可以重写解析函数并将其设置为那样。。。我现在有:
JobSummarySnapshot = Backbone.Model.extend({
url: '/JobSummaryList',
defaults: {
pageNumber: 1,
summaryList: new JobSummaryList()
},
parse: function(response) {
this.set({pageNumber: response.pageNumber});
var summaryList = new JobSummaryList();
summaryList.add(response.summaryList);
this.set({summaryList: summaryList});
}
});
到目前为止,这是可行的。如果有人对该问题发表评论,请将问题留待讨论。…您的parse()
函数不应该set()
任何内容,最好只返回属性,主干将负责设置它。e、 g
parse: function(response) {
response.summaryList = new JobSummaryList(response.summaryList);
return response;
}
从parse()
返回的任何内容都是
不返回任何内容(类似于返回未定义的)与调用集(未定义的)
相同,这可能会导致它无法通过验证,或者如果自定义验证()
/集()
方法希望获得对象,则会导致其他一些意外结果。如果验证或set()
方法因此失败,将不会调用传递给Backbone.Model#fetch()
的options.success
回调
另外,为了使这更通用,以便从其他位置(不仅是从服务器响应)对普通对象执行的set()
ing操作也会对其产生影响,您可能需要替代set()
:
set: function(attributes, options) {
if (attributes.summaryList !== undefined && !(attributes.summaryList instanceof JobSummaryList)) {
attributes.summaryList = new JobSummaryList(attributes.summaryList);
}
return Backbone.Model.prototype.set.call(this, attributes, options);
}
您可能还发现了有趣的地方——它使处理嵌套在模型中的集合/模型变得更加容易
编辑我忘了从set()方法返回,代码现在已更新非常感谢。我对今天只读了一半的东西感到内疚,它又一次咬了我一口。它在文档中明确指出,正如您上面提到的,您从解析函数返回obj。。。。但我不知怎么错过了。再次感谢。
set: function(attributes, options) {
if (attributes.summaryList !== undefined && !(attributes.summaryList instanceof JobSummaryList)) {
attributes.summaryList = new JobSummaryList(attributes.summaryList);
}
return Backbone.Model.prototype.set.call(this, attributes, options);
}