簡體   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