我已经从服务器获得了以下JSON。这样,我想创建一个带有嵌套模型的模型。我不确定哪一种是实现这一点的方法。
//json
[{
name : "example",
layout : {
x : 100,
y : 100,
}
}]
我希望将这些转换为具有以下结构的两个嵌套主干模型:
// structure
Image
Layout
...
所以我这样定义布局模型:
var Layout = Backbone.Model.extend({});
但是,我应该使用下面两种(如果有的话)技术中的哪一种来定义Image模型呢?下面是A还是B?
A
var Image = Backbone.Model.extend({
initialize: function() {
this.set({ 'layout' : new Layout(this.get('layout')) })
}
});
或者,B
var Image = Backbone.Model.extend({
initialize: function() {
this.layout = new Layout( this.get('layout') );
}
});
发布于 2012-03-28 17:40:38
我在写我的主干应用程序时也遇到了同样的问题。必须处理嵌入式/嵌套模型。我做了一些调整,我认为这是一个相当优雅的解决方案。
是的,您可以修改解析方法来更改对象中的属性,但所有这些实际上都是很难维护的代码,而且感觉更像是一个hack而不是一个解决方案。
以下是我对您的示例的建议:
首先像这样定义你的布局模型。
var layoutModel = Backbone.Model.extend({});
然后这是你的图像模型:
var imageModel = Backbone.Model.extend({
model: {
layout: layoutModel,
},
parse: function(response){
for(var key in this.model)
{
var embeddedClass = this.model[key];
var embeddedData = response[key];
response[key] = new embeddedClass(embeddedData, {parse:true});
}
return response;
}
});
请注意,我并没有篡改模型本身,只是从parse方法传回了所需的对象。
当您从服务器读取数据时,这应该可以确保嵌套模型的结构。现在,您会注意到,保存或设置实际上没有在这里处理,因为我觉得使用适当的模型显式地设置嵌套模型对您来说是有意义的。
如下所示:
image.set({layout : new Layout({x: 100, y: 100})})
还要注意,您实际上是通过调用以下命令来调用嵌套模型中的parse方法:
new embeddedClass(embeddedData, {parse:true});
您可以根据需要在model
字段中定义任意多个嵌套模型。
当然,如果您想要将嵌套模型保存在它自己的表中。这是不够的。但是在读取和保存整个对象的情况下,这种解决方案应该足够了。
发布于 2011-11-23 15:46:16
我把这段代码作为Peter Lyon建议重新定义解析的一个例子。我也有同样的问题,这对我很有效(使用Rails后端)。这段代码是用Coffeescript编写的。我为不熟悉它的人做了一些明确的事情。
class AppName.Collections.PostsCollection extends Backbone.Collection
model: AppName.Models.Post
url: '/posts'
...
# parse: redefined to allow for nested models
parse: (response) -> # function definition
# convert each comment attribute into a CommentsCollection
if _.isArray response
_.each response, (obj) ->
obj.comments = new AppName.Collections.CommentsCollection obj.comments
else
response.comments = new AppName.Collections.CommentsCollection response.comments
return response
或者在JS中
parse: function(response) {
if (_.isArray(response)) {
return _.each(response, function(obj) {
return obj.comments = new AppName.Collections.CommentsCollection(obj.comments);
});
} else {
response.comments = new AppName.Collections.CommentsCollection(response.comments);
}
return response;
};
发布于 2012-09-23 12:08:24
使用Backbone-associations中的Backbone.AssociatedModel
:
var Layout = Backbone.AssociatedModel.extend({
defaults : {
x : 0,
y : 0
}
});
var Image = Backbone.AssociatedModel.extend({
relations : [
type: Backbone.One,
key : 'layout',
relatedModel : Layout
],
defaults : {
name : '',
layout : null
}
});
https://stackoverflow.com/questions/6535948
复制相似问题