Backbone.js模型与集合

我有2个模型和一个集合。 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() } }); 

当我在JobSummarySnapshot对象上调用fetch时,它会得到一切…除了当我移动通过summaryList集合时,它们都是typesobject而不是JobSummary

我想这是有道理的,因为除了defaults对象以外,它不知道summaryList应该是JobSummaryListtypes。 我可以通过每个项目,并将其转换为一个JobSummary对象,但我希望有办法做到这一点,而不必手动。

这里是我的testing代码(在这里工作jsfiddle ):

 var returnData = { pageNumber: 3, summaryList: [ { id: 5, name: 'name1'}, { id: 6, name: 'name2'} ] }; var fakeserver = sinon.fakeServer.create(); fakeserver.respondWith('GET', '/JobSummaryList', [200, { 'Content-Type': 'application/json'}, JSON.stringify(returnData)]); var callback = sinon.spy(); var summarySnapshot = new JobSummarySnapshot(); summarySnapshot.bind('change', callback); summarySnapshot.fetch(); fakeserver.respond(); var theReturnedList = callback.getCall(0).args[0].attributes.summaryList; _.each(theReturnedList, function(item) { console.log('Original Item: '); console.log(item instanceof JobSummary); // IS FALSE var convertedItem = new JobSummary(item); console.log('converted item: '); console.log(convertedItem instanceof JobSummary); // IS TRUE }); 

更新:我想到,我可以重写parsing函数,并设置它的方式…我现在有这个:

 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()任何东西,它只是返回属性的一个更好的做法,骨干将负责设置它。 例如

 parse: function(response) { response.summaryList = new JobSummaryList(response.summaryList); return response; } 

无论你从parse()返回什么都传递给set()

不返回任何东西(就像返回undefined )和调用set(undefined)相同,如果你的自定义validate() / set()方法希望得到一个对象,可能会导致它不能通过validation或者其他一些意想不到的结果。 如果您的validation或set()方法因此而失败,传递给Backbone.Model#fetch()options.successcallback将不会被调用。

此外,为了使这个更通用,所以set()从其他地方(而不仅仅是从服务器响应)的普通对象也影响它,你可能想要覆盖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); } 

你也可能发现Backbone-relational有趣的 – 它处理嵌套在模型中的集合/模型更容易。

编辑我忘了从set()方法返回,代码现在更新