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);
}