我最终让它按照我想要的方式工作。多对多关系在数据库中维护,但这些关系只能在我的 Backbone 模型中以一个方向访问。我决定 Person 模型将是独立的,而 PersonGroup 模型将具有对其链接到的 Person 模型的引用集合。
使一切正常工作的关键点是指定includeInJSON: "ID"
并删除reverseRelation
。这仍然允许您访问 JavaScript 中模型的引用,但它可以正确序列化和反序列化为 JSON。 Person 模型根本无法访问其所在组的导航属性,但是它们can存在于多个组中就好了。
我只是假设使用 ID 列表会要求跳过各种步骤来解析引用,但 Backbone 关系似乎使用全局 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",
},
],
});
如果对任何人都有帮助,这里是其余的管道。您可以按如下方式定义 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,
},
}
);
我包含了用于使用 Knockout.js 绑定的 Knockback.js 特定集合。每个模型仅创建一个 ViewModel,因此更改跟踪会传播到整个应用程序。