首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Backbone-Relational实现多对多关系

使用Backbone-Relational实现多对多关系
EN

Stack Overflow用户
提问于 2013-07-23 21:22:29
回答 2查看 2.6K关注 0票数 7

我有一个简单的应用程序,它定义了两个类,一个Person和一个PersonGroup,其中存在一个多对多关系。一个人可以没有组,也可以被分配到所有组,以及介于两者之间的任何组。

backbonerelational.org上的示例建议对多对多关系使用中间模型,但是我无法将此模式用于获取(反序列化)和保存(序列化)。

我想要做的是使用Backbone来反序列化一个类似如下的JSON:

代码语言:javascript
复制
{
    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进行数据绑定,所以问题是我需要能够通过引用来访问关系。ID数组对我没有任何好处,除非我可以创建一个Knockback.CollectionObservable来包装集合并将ID解析为引用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-24 00:11:07

我最终让它以我想要的方式工作。多对多关系在数据库中维护,但这些关系只能在我的主干模型中单向访问。我决定Person模型将是独立的,并且PersonGroup模型将具有对它们所链接的Person模型的引用的集合。

这里让一切正常工作的关键点是指定includeInJSON: "ID"并删除reverseRelation。这仍然允许您访问对JavaScript中的模型的引用,但是它可以正确地序列化和反序列化到JSON。Person模型无法访问它们所在的组的导航属性,但是它们可以存在于多个组中。

我只是假设使用ID列表将强制跳转来解析引用,但是Backbone-relational似乎使用全局骨干模型存储来通过ID解析引用,而不会创建重复的模型。(例如,三个不同的组可以引用同一个人,并且只创建了一个模型)。

代码语言:javascript
复制
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",
        },
    ],
});

如果它能帮助anyone.You按如下方式定义Backbone.Collections,并通过单独的API请求获得它们,那么这里就是剩下的部分:

代码语言:javascript
复制
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,因此更改跟踪将在整个应用程序中传播。

票数 8
EN

Stack Overflow用户

发布于 2013-09-20 05:48:23

这个问题已经提了两个月了,不过我还是想分享一下,我在使用Backbone-relational时遇到了类似的多对多关系问题。这些问题导致编写了自己的骨干关系实现,该实现支持多对多关系,而没有中间的链接模型:Backbone-JJRelational

我是以作者之一的身份回答的,但可能值得一查。

例如,您在问题中发布的JSON将按以下方式自动反序列化:

每个PeopleGroups-model都有一个属性People,它是一个包含适当Backbone.Collection的People-models (当然,反之亦然),因此可以很容易地从两端访问该关系(不需要链接模型)。

Backbone-JJRelational的一些概念类似于Backbone-relational (例如,全局模型存储)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17811451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档