我有2个模型和1个收藏集。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()
}
});
当我调用fetch
该JobSummarySnapshot
对象时,它得到了所有东西…除了当我在summaryList
集合中移动时,它们都是类型object
而不是类型JobSummary
。
我认为这是有道理的,因为除了defaults
对象之外,它不知道the
summaryList
的类型应该是JobSummaryList
。我可以遍历每个项目并将其转换为JobSummary
对象,但是我希望有一种无需手动进行操作的方法。
这是我的测试代码(在这里使用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
});
更新:我想到我可以覆盖解析函数并以这种方式设置…我现在有这个:
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()
什么也不做,只是返回属性的一种更好的做法,Backbone将负责设置它。例如
parse: function(response) {
response.summaryList = new JobSummaryList(response.summaryList);
return response;
}
无论您返回什么,parse()
都会传递给set()
。
不返回任何内容(就像return一样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);
}
您可能还会发现Backbone关系很有趣-
它使处理嵌套在模型中的集合/模型更加容易。
编辑 我忘了从set()方法返回,代码现在已更新
问题内容: 我有一个带一些默认值和url的bone.js模型: 然后,我有此模型的一个实例,然后继续保存它: 现在,我想使用PHP脚本“ save.php”将此模型保存到MySQL数据库中,如下所示: 我尝试阅读许多教程,但无法保存此简单模型。为什么我的代码不起作用?关于如何解决的任何想法? 谢谢 编辑:快速解决方案 在php脚本中,从发送的JSON对象获取信息的正确方法如下: 并存储在数据库中:
问题内容: 我更喜欢前端开发,并且最近开始将Backbone.js探索到我的应用程序中。我想将模型数据保存到服务器。 您能否解释一下保存模型数据的各种方式(使用json格式)。我在服务器端使用Java。我也主要看到REST用于保存数据。由于我更喜欢前端开发人员,因此我不了解REST和其他类似内容。 如果有人可以用一些简单的例子向我解释这个过程,那就太好了。 问题答案: 基本上,模型具有称为属性
本文向大家介绍Backbone.js中的集合详解,包括了Backbone.js中的集合详解的使用技巧和注意事项,需要的朋友参考一下 Backbone.js的集合只是一个简单的有序集的模型。通过适应模型和集合,我们可以避免数据处理逻辑放到了我们的视图层。此外,模型和集合还提供了便利的与后端一起工作的方法,当数据发生变化时,可以自动化地标记Backbone.js视图。这样,它可以用于如下的情况: 通常
08-10 11:56:28.905 280 66-28066/android.example.com.TFLiteCamerademo E/MultiWindowProxy:getServiceInstance失败!08-10 11:56:35.675 280 66-28092/Android.example.com.TFLiteCamerademo E/AndroidRuntime:致命异常:
MVC框架 零框架解决方案 Backbone的加载 Backbone的用法 Backbone.View 基本用法 initialize方法 el属性,$el属性 tagName属性,className属性 template方法 events属性 listento方法 remove方法 子视图(subview) Backbone.Router routes属性 Backbone.history Ba
问题内容: 我有一个REST Json API,它返回一个列表“ logbooks”。有许多实现不同但相似行为的日志。在数据库层的服务器端实现是一种单表继承,因此日志的每个JSON表示都包含其“类型”: 我想在客户端复制此服务器模型,所以我有一个基类和多个日志子类: 我的是一组用于查询JSON API的模型: 当我获取日志集合时,是否有一种方法可以将每个对象转换为其对应的子类(基于JSON“ ty