2012-03-23 78 views
4

我目前正在構建一個應用程序,使用Backbone.js和多種不同的模型,這些模型以各種方式相互關聯。我目前正在嘗試各種架構方法。Backbone.js - 全球/共享/相關模型的最佳方法是什麼?

簡而言之模型關係看起來是這樣的:

Workspace > Projects > Tasks 

還有一些其他車型,如清單和類別,附加到一個項目。

在有任務列表的頁面,我傾銷任務的JSON到頁面上,填補了集合。這工作正常,但目前所有任務都拉入他們自己的項目數據。

task.project.id 
task.project.name 

該項目也被拉到頁面上各種其他地方的各種名單。任務也可以是分配給項目的列表的一部分。這意味着我也會提出請求,在各個地方爲項目提供列表。

與此的主要問題是,在地方更新模型時,我需要找到某種方式來「同步」他們。這太瘋狂了。他們應該都使用相同的模型實例,以便每個視圖都使用相同的模型,並相應地進行更新,而無需執行任何操作。

我一直在研究各種Backbone.js的建築設計,試圖找到答案。例如,Chaplin(https://github.com/moviepilot/chaplin)使用中介對象在視圖之間傳遞數據。使用這種方法,我可以在中介上創建一個Projects集合,並通過中介對象將其傳遞給各個視圖。

每個項目將包括它的所有名單,類別,分配的用戶等。然後我可以要求一個項目的模型,像這樣:

App.Projects.get(12) 

那麼任務將剛需項目ID和一個getter和setter方法。視圖可以輕鬆訪問可用的項目,項目列表和項目用戶,而無需依賴挖掘模型或進一步的AJAX調用。另外,任務模型不需要任何項目數據。

然而,在全局對象傾銷所有這些數據似乎不錯。

我將可能最終的東西是這樣的:

App.Workspaces 
App.Workspaces.get(1) 
App.Projects 
App.Projects.get(12).get('lists')[0] 
App.Projects.get(12).get('users') 

要使用這樣的:

var projectId = model.get('project') 
var project = App.Projects.get(projectId) 

或用getter方法:

var project = model.getProject() 

並添加調解員作爲模型級別的依賴關係。

加入大量全局對象這樣增加了相當大的依賴性,可以使測試的難度。假設調解員甚至可以提供項目似乎也是錯誤的。也許它可以使模型,獲取並返回它,如果它不存在。

這裏的任何幫助將是偉大的!我很想知道其他人如何解決這個問題。

+0

我應該提到我已經看過Backbone-Relational和Ligament。它不是我正在尋找的完全嵌套的模型(我認爲),它是確保只爲頁面上的每個實體創建一個模型的一種方式。 1任務 - > 1模型。 – 2012-03-23 05:20:28

+0

chaplin是相當有趣的,真實的,Backbone是低層次的,並且不是一個框架,只是一堆有用的函數。脊柱更加結構化,在我看來,以及Ember.js – mpm 2012-03-23 08:54:50

回答

4

我建議您有一個常見的Collection爲所有您的Task模型。 緩存

類似於:App.Store.Tasks

你需要養活Poject.Tasks任何時候,首先看在App.Store.Tasks,然後:

一個。如果您在那裏找到Task,請將其添加到您的Project.Tasks

B。如果沒有找到那麼create,fetch並將其添加到:App.Store.TasksProject.Tasks

這樣其他Project試圖fetch a Task已退出將做相同的,他們都將共享相同的Model

如果您在Project中修改您的Task型號中的任意一款,您將會在其他所有Project中修改此Task

+0

很好的答案!這是我的想法,但我不確定這是不是一個好主意。 – 2012-03-27 11:23:08

相關問題