2012-03-23 14 views
4

私は現在、Backbone.jsを使用して、様々な方法でお互いに関連するいくつかの異なるモデルを使ってアプリケーションを構築しています。私は現在、さまざまな建築的アプローチを試しています。一言で言えばBackbone.js - グローバル/共有/関連モデルの最適なアプローチは何ですか?

は、モデルの関係は次のようになります。

Workspace > Projects > Tasks 

プロジェクトに添付されているリストやカテゴリなど、いくつかの他のモデルは、あります。

タスクリストのあるページでは、タスクのJSONをページにダンプしてコレクションを埋めます。これは正常ですが、現時点ではすべてのタスクが自分のプロジェクトデータを取り込んでいます。

task.project.id 
task.project.name 

プロジェクトは、さまざまなリストのページ上のさまざまな場所にも引き込まれています。タスクは、プロジェクトに割り当てられたリストの一部でもかまいません。これは、私はまた、さまざまな場所でプロジェクトのリストを引き出すよう要求していることを意味しています。

この問題の主な問題は、モデルを適切な場所で更新するときに、それらを「同期」する方法を見つける必要があるということです。どちらが狂っているの?それらはすべて同じモデルインスタンスを使用している必要があります。そのため、各ビューは同じモデルを使用しており、何もせずに更新されます。

私は様々なBackbone.jsアーキテクチャ設計を研究して答えを見つけようとしています。たとえば、Chaplin(https://github.com/moviepilot/chaplin)は、メディエータオブジェクトを使用してビュー間でデータを渡します。このアプローチを使用して、私はMediatorにProjectsコレクションを持ち、これをmediatorオブジェクトを介してさまざまなビューに渡すことができました。

各プロジェクトは、それのすべてが含まれますが、その後、私はそうのようなプロジェクトモデルのために要求することができるリスト、カテゴリ、割り当てられたユーザーなどです。

App.Projects.get(12) 

その後タスクは、単にプロジェクトのIDとゲッターが必要になりますし、セッターメソッド。ビューは、モデルを掘り下げたり、さらにAJAXを呼び出すことなく、利用可能なプロジェクト、プロジェクトリスト、プロジェクトユーザに簡単にアクセスできます。さらに、タスクモデルはプロジェクトデータを必要としません。

ただし、このすべてのデータをグローバルオブジェクトにダンプするのは悪いようです。

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

またはgetterメソッドを持つ::次のように使用するには

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

var project = model.getProject() 

メディエータを追加し、私はおそらくこのようなものに終わるだろう

代わりにモデルレベルでの依存関係として使用します。

このように大きなグローバルオブジェクトを追加すると、テストを困難にするかなり大きな依存関係が追加されます。また、メディエイターがプロジェクトを利用できるとすることも間違っているようです。おそらくモデルを作り、それを取り出してそれが存在しなければ返すかもしれない。

ここのヘルプは素晴らしいでしょう!私は他の人がこの問題をどのように解決したかを知りたいです。

+0

私はおそらく、私がバックボーン・リレーショナルと靭帯を見てきたと言えるでしょう。私が探しているのはちょうどネストされたモデルではありませんが、それはページ上の各エンティティに対して1つのモデルが作成されることを保証する方法です。 1タスク - > 1モデル。 –

+0

chaplinは非常に興味深いですし、実際、バックボーンは低レベルであり、とにかくフレームワークではなく、ほんの一握りの役に立つ機能です。脊椎は私の意見と同様にEmber.jsと同様に構造化されています – mpm

答えて

4

すべてTaskモデルの場合、共通Collectionをお勧めします。種類:キャッシュ例えば、App.Store.Tasks

あなたがPoject.Tasksを養うために必要があるときはいつでも、その後App.Store.Tasksとで最初に見える:

を。 Taskが見つかった場合は、それを取り出してProject.Tasksに追加してください。

b。そこに見つからない場合はcreate,fetchとし、App.Store.TasksProject.Tasksの両方に追加してください。

fetchすでに同じことを行います終了し、両者が同じModelを共有するTaskにしようとProject他のこの方法です。

あなたが他のすべてのProjectでこのTaskを変更することがありますProjectであなたのTaskモデルのいずれかを変更し、任意の時間。

+0

偉大な答え!それは私が思っていたもののラインに沿っていますが、それが悪い考えであるかどうかはわかりませんでした。 –

関連する問題