Bry*_*her 37 javascript ajax json 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()
}
});
Run Code Online (Sandbox Code Playgroud)
当我调用fetch该JobSummarySnapshot对象时,它会获得所有内容......除非我在summaryList集合中移动它们都是类型object而不是JobSummary.
我认为这是有道理的,因为除了defaults对象之外,它不知道summaryList应该是类型JobSummaryList.我可以浏览每个项目并将其转换为JobSummary对象,但我希望有一种方法可以在不必手动操作的情况下完成.
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
});
Run Code Online (Sandbox Code Playgroud)
更新:我想到我可以覆盖解析函数并设置它......我现在有这个:
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});
}
});
Run Code Online (Sandbox Code Playgroud)
这项工作到目前为止.保留问题,以防有人评论....
she*_*sek 56
你的parse()功能不应该是set()什么,只是返回属性是一个更好的做法,Backbone将负责设置它.例如
parse: function(response) {
response.summaryList = new JobSummaryList(response.summaryList);
return response;
}
Run Code Online (Sandbox Code Playgroud)
无论你从哪里回来都会parse()被传递给set().
不返回任何内容(类似于返回undefined)与调用相同set(undefined),这可能导致它不通过验证,或者如果您的自定义validate()/ set()方法期望获取对象,则会导致其他一些意外结果.如果您的验证或set()方法因此而失败,则不会options.success调用传递给它的回调Backbone.Model#fetch().
另外,为了使它更通用,以便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);
}
Run Code Online (Sandbox Code Playgroud)
您可能还会发现骨干关系有趣的-这使得它更容易处理内部嵌套模式的集合/模型.
编辑我忘了从set()方法返回,现在代码已更新
| 归档时间: |
|
| 查看次数: |
30081 次 |
| 最近记录: |