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
应该是JobSummaryList
types。 我可以通过每个项目,并将其转换为一个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.success
callback将不会被调用。
此外,为了使这个更通用,所以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()方法返回,代码现在更新