Javascript 使用关系主干实现多对多关系

Javascript 使用关系主干实现多对多关系,javascript,backbone.js,backbone-relational,knockback.js,Javascript,Backbone.js,Backbone Relational,Knockback.js,我有一个简单的应用程序,它定义了两个类,Person和PersonGroup,其中存在多对多关系。一个人可以没有组,也可以被分配到所有组,以及介于两者之间的任何内容 backbonerelational.org上的示例建议对多对多关系使用中间模型,但是我无法使此模式用于获取(反序列化)和保存(序列化) 我要做的是使用主干对JSON进行反序列化,类似于以下内容: { People: [ { "ID": 1, "Name

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

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

我要做的是使用主干对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进行数据绑定,所以问题是我需要能够通过引用访问关系。ID数组对我没有任何好处,除非我可以创建击退。CollectionObservable可以包装集合并将ID解析为引用。

我最终得到了我想要的工作方式。多对多关系在数据库中维护,但只能在我的主干模型中单向访问这些关系。我决定Person模型将是独立的,PersonGroup模型将有一组对链接到的Person模型的引用

这里的关键点是指定
includeInJSON:“ID”
并删除
反向关联。这仍然允许您访问JavaScript中对模型的引用,但它正确地序列化并反序列化为JSON。人物模型根本无法访问其所在组的导航属性,但是它们可以存在于多个组中

我只是假设,使用ID列表将要求跳转来解析引用,但是关系主干似乎使用全局主干模型存储来解析ID引用,而不创建重复的模型。(例如,三个不同的组可以引用同一个人,并且只创建了一个模型)

下面是管道的其余部分(如果有帮助的话)。您可以定义主干。集合如下,并通过单独的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绑定的knockock.js特定集合。每个模型只创建一个ViewModel,因此更改跟踪将在整个应用程序中传播。

这个问题大约有两个月了,不过我想告诉大家,在使用关系主干时,我遇到了类似的多对多关系问题。这些问题导致编写自己的主干关系实现,该实现支持多对多关系,而中间没有链接模型:

我作为作者之一回答,但可能值得一看。
例如,您在问题中发布的JSON将以以下方式自动反序列化:
每个
PeopleGroups
-模型都有一个属性
People
,该属性是一个主干。集合包含适当的
人员
-模型,当然也包含相应的
人员
-模型,因此可以从双方轻松访问关系(无需链接模型)。
主干JJRelational的一些概念类似于主干关系(例如,全局模型存储)

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,
        },
    }
);