繁体   English   中英

与Backbone-Relational实现多对多关系

[英]Implementing a Many-to-Many relationship with Backbone-Relational

我有一个简单的应用程序,它定义了两个类,一个Person和一个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
            ],
        },
    ]
}

我正在使用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",
        },
    ],
});

如果它可以帮助任何人,那么这是其余的管道。您可以按如下方式定义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,
        },
    }
);

我包含了Knockback.js特定的集合,用于使用Knockout.js绑定。 每个模型只创建一个ViewModel,因此更改跟踪将在整个应用程序中传播。

这个问题大概有两个月了,不过我想分享一下,在使用Backbone-relational时遇到了与多对多关系有关的类似问题。 这些问题导致编写了一个自己的Backbone关系实现,它支持多对多关系,而且两者之间没有链接模型: Backbone-JJRelational

我作为作者之一回答,但值得一试。
例如,您在问题中发布的JSON将按以下方式自动反序列化:
每个PeopleGroups -model都有一个属性People ,它是一个Backbone.Collection,包含适当的People -models和(当然)反之亦然,因此可以从两侧轻松访问关系(没有链接模型)。
Backbone-JJRelational的一些概念类似于Backbone-relational(例如全局模型存储)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM