2013-07-23 95 views
6

我有一個簡單的應用程序,它定義了兩個類,一個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.CollectionObservable來包裝集合並將ID解析爲引用,否則ID的數組對我沒有任何好處。

回答

7

我最終以我想要的方式工作。多對多關係在數據庫中維護,但只能在一個方向上在我的骨幹模型中訪問關係。我決定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", 
     }, 
    ], 
}); 

而這裏的管道的其餘部分,如果有幫助anyone.You可以定義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,以便更改跟蹤通過整個應用程序傳播。

3

這個問題大概有兩個月的時間了,不過我想分享一下,在使用Backbone-relational時,我碰到類似的多對多關係問題。這些問題導致寫了一個自己實現的骨幹關係,它支持多對多的關係,但沒有鏈接模型: Backbone-JJRelational

我作爲作者之一回答,但它可能值得檢查出。
你在你的問題發佈的JSON,例如,將自動按以下方式反序列化:
每個PeopleGroups -model有一個屬性People是包含適當People -models和(當然)副一Backbone.Collection -versa,所以關係可以很容易地從雙方訪問(沒有鏈接模型)。
Backbone-JJRelational的一些概念與Backbone-relational(例如全局模型商店)類似。