Tre*_*ott 7 javascript backbone.js backbone-relational knockback.js
我有一个简单的应用程序,它定义了两个类,a Person和a PersonGroup,其中存在多对多关系.一个人可以没有任何组,或者被分配给所有组,以及介于两者之间的任何组.
backbonerelational.org上的示例建议使用中间模型来实现多对多关系,但是我不能将此模式用于获取(反序列化)和保存(序列化).
我想要做的是使用Backbone来反序列化类似于以下内容的JSON:
{
People:
[
{
"ID": 1,
"Name": "John"
},
{
"ID": 2,
"Name": "Bob"
},
{
"ID": 3,
"Name": "Tim"
},
],
PeopleGroups:
[
{
"ID": 1,
"Name": "Owners",
"People":
[
1,
2
],
},
{
"ID": 2,
"Name": "Everyone",
"People":
[
1,
2,
3
],
},
]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Knockback/Knockout进行数据绑定,所以问题是我需要能够通过引用访问关系.除非我能创建一个Knockback.CollectionObservable来包装集合并将ID解析为引用,否则ID数组对我没有任何帮助.
我最终以我想要的方式工作.多对多关系在数据库中维护,但只能在我的Backbone模型中以一个方向访问关系.我决定Person模型将是独立的,PersonGroup模型将具有对它们链接到的Person模型的引用的集合.
这里使一切工作的关键点是指定includeInJSON: "ID"和删除reverseRelation.这仍然允许您在JavaScript中访问模型的引用,但它正确地序列化和反序列化为JSON.Person模型根本无法访问它们所在的组的导航属性,但是它们可以存在于多个组中.
我只是假设使用ID列表会强制跳过箍来解析引用,但Backbone-relational似乎使用全局Backbone模型存储来解析ID引用而不创建重复模型.(例如,三个不同的组可以引用同一个人,并且只创建一个模型).
var Person = Backbone.RelationalModel.extend(
{
idAttribute: "ID",
});
var PersonGroup = Backbone.RelationalModel.extend(
{
idAttribute: "ID",
relations:
[
{
type: Backbone.HasMany,
key: "People",
relatedModel: "Person",
collectionType: "PersonCollection",
includeInJSON: "ID",
},
],
});
Run Code Online (Sandbox Code Playgroud)
如果它可以帮助任何人,那么这是其余的管道.您可以按如下方式定义Backbone.Collections并通过单独的API请求获取它们:
var PersonCollection = Backbone.Collection.extend(
{
model: Person,
url: "/api/person",
});
var PersonGroupCollection = Backbone.Collection.extend(
{
model: PersonGroup,
url: "/api/persongroup",
});
var PersonModels = new PersonCollection();
var GroupsModels = new PersonGroupCollection();
this.PersonModels.fetch();
this.GroupsModels.fetch();
this.People = kb.collectionObservable(
this.PersonModels,
{
factories:
{
"models": PersonViewModel,
},
}
);
this.PersonGroups = kb.collectionObservable(
this.GroupsModels,
{
factories:
{
"models": PersonGroupViewModel,
"models.People.models": PersonViewModel,
},
}
);
Run Code Online (Sandbox Code Playgroud)
我包含了Knockback.js特定的集合,用于使用Knockout.js绑定.每个模型只创建一个ViewModel,因此更改跟踪将在整个应用程序中传播.
| 归档时间: |
|
| 查看次数: |
2557 次 |
| 最近记录: |