我看到有一些技术可以在 Backbone 中建立深度模型,但是单个模型的分层集合呢?
一个明显的例子是类别树。所以,我们可以有一个类别模型,它有几个属性,“名称”、“类型”、“颜色”等等。
我们使用的是 js,而不是使用关系 db 样式的父 ID,因此我们希望将数据表示为 json。
是否可以利用主干来支持(可能是通过增加集合)包含树中单个模型实例的数据结构(使得模型和子模型都是同一模型的实例)?
我看到有一些技术可以在 Backbone 中建立深度模型,但是单个模型的分层集合呢?
一个明显的例子是类别树。所以,我们可以有一个类别模型,它有几个属性,“名称”、“类型”、“颜色”等等。
我们使用的是 js,而不是使用关系 db 样式的父 ID,因此我们希望将数据表示为 json。
是否可以利用主干来支持(可能是通过增加集合)包含树中单个模型实例的数据结构(使得模型和子模型都是同一模型的实例)?
看看Backbone-Relational或supermodel.js。
这些项目提供了比默认实现更好的模型嵌套形式。
我们只是嵌套 Backbone 模型,例如:
var MyModel = Backbone.Model.extend({});
var MySubModel = Backbone.Model.extend({});
var model = new MyModel({submodel: new MySubModel({color: 'blue'})});
我们覆盖了这些toJSON
方法:
// nested models! Might just override the internal representation of this...
_.extend(Backbone.Model.prototype, {
// Version of toJSON that traverses nested models
toJSON: function() {
var obj = _.clone(this.attributes);
_.each(_.keys(obj), function(key) {
if(!_.isUndefined(obj[key]) && !_.isNull(obj[key]) && _.isFunction(obj[key].toJSON)) {
obj[key] = obj[key].toJSON();
}
});
return obj;
}
});
_.extend(Backbone.Collection.prototype, {
// Version of toJSON that traverses nested models
toJSON: function() {
return this.map(function(model){ return model.toJSON(); });
}
});
因此,当我们嵌套模型时,JSON 表示看起来是正确的。不过,您必须注意parse
模型上的方法 - 当您从服务器取回 JSON 时,您将不得不在那里生成所有子模型和集合,以使其正常工作。