2012-06-03 36 views
11

我被困在如何設計我的模型關係的backbone.js應用程序。如何處理backbone.js中的關係

如果我有一個事件模型,它有幾個關係,比如用戶模型可以有很多事件,而事件模型又可以有很多評論和參與。用戶可以有很多評論,參與者可以有一個用戶和一個事件。哇,真是一團糟!

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結合指向人。可恥的是指的一個答案,我今天給,檢查出來,它會讓生活變得更輕鬆無論什麼: Backbone Design

18

像@mu_is_too_short評論,骨幹關係可能是一個你有興趣尋找到。通過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)。只要這些引用是以數組形式定義的,那麼您可以使用Relational的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 
}); 

等等,等等

這是生產一對一,一對多,和逆關係的一個很好的方式。這非常關鍵。定義模型之間的關係並創建模型時。

E.g.您創建一個用戶模型的新實例。

骨幹關係自動創建反向鏈接(事件模型有一個由反向關係鍵'belongsToUser'定義的屬性(或者你命名的任何東西),這使得它很方便地在模型/模型的層次結構。

根據您的需求關係這似乎是一個不錯的選擇。

如果你想多對多的,有(使用中級車型),那麼這是一種迂迴的方式,但我發現Paul-Uithol一直在更新Backbone-Relational一段時間,新功能也不斷增加。起初,學習曲線對我來說有點困難,但一旦你開始了習慣它它是非常方便的。

注意:爲了強調,Mosselman建議Require.js,我也非常同意這一點。它使我的代碼更易於管理。您可以修改(包裝)骨幹關係代碼,使其符合AMD標準,並且可以在需求中完美工作。

UPDATE:骨幹關係現在支持2014年4月1日,作爲require.js發佈0.8.8的 - 感謝肯尼斯

+0

是否有可能通過一個事件模型,事件關聯到用戶? 'myUser.set('events',[myEvent1,myEvent2,myEvent3]);'那樣的東西?或者你是否必須通過相關的模型ID來引用關係? –

+1

自2014年4月1日起,@orangewarp backbone-relational現在支持自版本0.8.8開始的require.js。請參閱http://backbonerelational.org/#change-log – Kenneth