2013-07-23 10 views
6

私はPersonPersonGroupという2つのクラスを定義する単純なアプリケーションを用意しています。そこに多対多の関係があります。人はグループを持たなくてもよいし、すべてのグループに割り当てられてもよい。バックボーン・リレーショナルとの多対多関係の実装

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 
      ], 
     }, 
    ] 
} 

私はデータバインディングのためにノックバック/ノックアウトを使用しています関係による参照。 IDの配列は、Knockback.CollectionObservableを作成してコレクションをラップし、IDを参照に解決することができない限り、私には何の役にも立たない。

答えて

7

私はこれが私が欲しかったように機能するようになった。多対多の関係はデータベース内で維持されますが、関係は私のBackboneモデルでのみ一方向にアクセスできます。私は、Personモデルがスタンドアローンであり、PersonGroupモデルがリンクされているPersonモデルへの参照のコレクションを持つことに決めました。

ここで重要な点は、includeInJSON: "ID"を指定し、reverseRelationを削除することでした。これにより、JavaScriptのモデルへの参照にアクセスできますが、正しくJSONにシリアル化および逆シリアル化されます。 Personモデルは、グループに属するナビゲーションプロパティにはアクセスできませんが、の複数のグループに存在します。

IDのリストを使用すると、参照を解決するためにジャンプスルーする必要があると単純に仮定しましたが、Backbone-relationalは、重複モデルを作成せずにIDによる参照を解決するためにグローバルバックボーンモデルストアを使用しているようです。 (例えば、3つの異なるグループが同じPersonを参照し、1つのモデルのみが作成されます)。私はKnockback.js特定を含め

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

:それはanyone.Youは次のようにBackbone.Collectionsを定義し、別のAPIリクエストを介してそれらを取得できる場合に役立ちます

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

そして、ここでは、配管の残りの部分ですKnockout.jsバインディングを使用するためのコレクション。モデルごとに1つのViewModelしか作成されないため、変更の追跡はアプリ全体に伝播されます。

3

この質問は約2ヶ月ですが、Backbone-relationalで作業するときに多対多の関係について同様の問題が発生したとお伝えしたいと思います。私は著者の一人として答えていますが、チェックする価値があるかもしれません Backbone-JJRelational

:これらの問題は、間に、連結モデルなしで多対多の関係をサポートするバックボーン関係の独自の実装の書き込みにつながりましたでる。
あなたは、あなたの質問に投稿されたJSONは、例えば、自動的に次のように直列化復元されます:各PeopleGroups -modelが適切People -modelsと(もちろん)バイスを含むBackbone.Collectionある属性Peopleを持って
-versaなので、関係は両方の側から簡単にアクセスできます(リンクモデルなし)。
Backbone-JJRelationalのいくつかの概念は、バックボーン・リレーショナル(例えば、グローバル・モデル・ストア)に類似しています。