2012-06-03 13 views
11

私のモデル関係に関して、私のbackbone.jsアプリケーションをどのように設計するかと悩んでいます。backbone.jsの関係を扱う方法

私はイベントモデルを持っていて、それにはいくつかの関係があります。ユーザーモデルには多くのイベントがあり、イベントモデルには多くのコメントと参加があります。ユーザーは多くのコメントを持つことができ、参加者は1人のユーザーと1つのイベントを持つことができます。うわー、何が混乱していますか?

Event has many Comments 
Event has many Participations 
Event has one User 

User has many Events 
User has many Participations 
User has many Comments 

Comment has one Event 
Comment has one User 

Participation has one User 
Participation has one Event 

オーケーは、ので、私の考えは、ユーザーがページをロードする際にイベントのリストをロードすることで、イベントをユーザーがクリックすると、そのイベントについての情報の残りの部分をロードする際に(コメント、参加およびユーザー) 。

問題は、すべてのイベント、ユーザーなどを保持するためのグローバル変数を使用する必要があります。また、サーバーから情報を取得してサーバーに情報を取得する前にチェックしてください。多分、何らかのローカルストレージで(そして、私はバックボーンリレーショナルを使ってこれをどうやってやっていますか?)

私が持っていた別のアイデアは、すべてのイベントに独自の独立したデータを持たせることです。問題は、イベントをクリックするたびに冗長なデータを送信するということです。

どのような方法をお勧めしますか?

ありがとうございました!

答えて

0

理論的には、すべての個別のコレクションを読み込み、コレクションのローカルフィルタリングを使用して、レンダリングの際に関連するモデルを取得できます。

もちろん、セキュリティの問題を考慮する必要があります。

私は少なくともあなたの質問から、あなたが取得しようとしている情報を明確にはっきりとしていませんでしたが、できる限り私はできるだけ答えようとします。

私は、いくつかの種類のイベントをいくつか余分なデータを持っていて、これに関する情報を表示する必要があると仮定します。

var Events = Backbone.Collection.extend({ 
    url: '/events', // You might want to let the app return only an account's events or something, not just ALL events. 
    initialize: function(){ 
     this.fetch(); 
    } 
}); 

var Comments = Backbone.Collection.extend({ 
    url: '/comments', 
    initialize: function(){ 
     _.bindAll(this, 'getEventComments'); 
     this.fetch(); 
    }, 

    getEventComments: function(event_id){ 
     return _.filter(this.models, function(model){ return model.get('event_id') == event_id; }); 
    } 
}); 
//etc 

アンダースコアのフィルタ機能を使用することによって、あなたは非常に迅速に、関連を取得することができます。そして、あなたはまた、私が言ったように

は、次のことを検討可能性など、コメントの追加のようなものを行うことができるようにする必要がありますあなたがそれらを必要とするたびに(例えば、レンダリング時に)モデル化します。

これは、サーバー側のスクリプトではこれと同じです。一部のデータベースでは、すべてのテーブルがレコードで保持されます。コレクションはここで行います。コードは、入力に基づいてデータベースに関連するものを要求します。

最後に、私は常にRequire.jsとBackboneの組み合わせを指し続けます。 @mu_is_too_shortはコメントのように、バックボーン・リレーショナルは、あなたがに探しに興味がある何かであるかもしれない Backbone Design

18

:臆面もなくそれをチェックアウト、私は今日与えた答えを参照のうえ、それがどんな人生を容易にしません。 Backbone-relationalを使用すると、モデルとサブモデルのコレクションが自動的に作成され、イベントは親子関係を通じて管理できます。

サンプルコードを提供するだけで、味わいを得ることができます。 サンプルコードの一部がこのように見える場合があります。

ユーザーは多くのイベントがあります:あなたはバックボーン・リレーショナル・モデルを作成する場合

User = Backbone.RelationalModel.extend({ 
    relations: [ 
     type: Backbone.HasMany, // Type of relationship 
     key: 'events',   // How we reference the sub-models in collection 
     relatedModel: 'Event', // The sub-model type 
     collectionType: 'EventCollection', // The sub-model collection 
     reverseRelation: { 
      key: 'belongsToUser'   // Key we use to refer to the parent 
     } 
    ], 
    // Other Backbone.Model properties and functions 
}); 

、それは自動的にあなたが指定する「キー」にちなんで名付けられたあなたのためのサブモデルのコレクションを作成します。だからあなたが持っている各ユーザーは、関連するイベントのコレクションを整理して整理します。

基本的に、ユーザーを作成またはフェッチするときは、必要な関連モデルへの参照を与えます。たとえば、ユーザーID = 1の場合、イベント5,7、および11が必要な場合があります(IDのみを使用しています)。これらの参照が配列形式で定義されている限り、リレーショナルのfetchRelatedメソッドを使用してそれらの参照を遅延ロードすることができます。

myUser = new User(); 
myUser.set({ 
    name: 'RayMysterio', 
    age: '26', 
    events: [5, 7, 11] // Or this might just come with the User object from your server 
}); 

myUser.fetchRelated('events'); 
// This will go fetch the related events for this user model from the URL you designate. 

myUser.get('events'); 
// The collection of events are treated like an attribute of the User model. 

myUser.get('events').find(function(eventModel){ 
    return // some find condition - or whatever you want to do on that collection 
}); 

特定のリスナーをサブモデルにバインドしたい場合があります。

myUser.bind('add:events', function(model, collection) { 
    // Whatever code you want to happen when new models are added to the user events coll 
}); 

等等

それは一から一、多くの一つであり、逆の関係を生成する良い方法です。これはかなり重要です。モデル間の関係を定義すると、モデルが作成されます。

など。ユーザーモデルの新しいインスタンスを作成します。

バックボーン・リレーショナルは自動的に逆リンクを作成します(イベント・モデルには、逆リレーション・キー 'belongsToUser'(または名前を付けてください)によって定義された属性があります)。これにより、モデル/モデル階層。

リレーショナルニーズに基づいて、これは良いフィットのように思える。

あなたは多くに多くをしたい場合は、(中間モデルを使用して)それを行うのラウンドについての方法がありますが、私は見つけましたPaul-Uitholはしばらくの間、Backbone-Relationalを更新していて、新しい機能が追加され続けています。最初は学習曲線が少し難しかったですが、一度始めるとそれに慣れると、それは大変便利です。

注:強調すると、MosselmanはRequire.jsを推奨しましたが、私もこれに強く同意します。私のコードをもっと管理しやすくしました。バックボーン・リレーショナル・コードを調整してAMDに準拠させることができ、Requireで完璧に機能します。

UPDATE:バックボーン・リレーショナルは今2014年4月1日にリリース0.8.8のようrequire.jsをサポートしています - 感謝ケネス

+0

それは、イベントモデルを介してユーザにイベントを関連付けることは可能ですか? 'myUser.set( 'events'、[myEvent1、myEvent2、myEvent3]);'それのようなもの?あるいは、関係するモデルIDを使って関係を参照する必要がありますか? –

+1

@orangewarp backbone-relationalは、2014年4月1日にリリース0.8.8でrequire.jsをサポートします。http://backbonerelational.org/#change-logを参照してください。 – Kenneth

関連する問題