問題。
同じコレクションを共有する必要がある一連のモジュールがあります。
モジュールを開始する前に、コレクションを準備する必要があります。
これを最もクリーンな方法で解決する方法がわかりません。これはプロジェクトごとに異なる可能性があることを認識していますが、ここにいくつかの考えがあります。
起動前にコレクションをロードします。
これは私の頭に浮かぶ最初のことです。「App.start()」を呼び出す直前にコレクションをロードするだけです。
次に、グローバルスコープでアクセスできるようにするだけです(これが好きかどうかはわかりません)。
ロードするまでサブモジュールの起動を遅らせます。
アプリを構成してメイン モジュールを持たせると、それがすべてのサブ モジュールの起動を担当します。
次に、サブモジュールを開始する前に、すべての重要なデータをプリロードし、準備ができていることを確認します。
次に、メインモジュール API を介してアクセスできるようにします。
これが悪いデザインかどうかはわかりませんが、マリオネットの経験が限られているためです。
今どうしてるんだろう。
Atm 「App.start()」の前にコレクションをロードすることを選択しました。これにより、テンプレートもプリロードしています。
コレクションのプロキシ/アクセス ポイントとして機能する「CollectionManager」と呼ばれる「静的」オブジェクトを導入しました。そして、グローバルに利用可能になります。
アプリケーションのセットアップ:
// Templates that should be ready on start up
var arrTemplatesPaths = [...];
// Collections that i need to be ready and shared between modules.
var arrSharedCollections = [
{id:"groups", collection: GroupCollection}
];
// Preloading the vital data.
$.when.apply(null, [
Templates.fetch(arrTemplatesPaths),
CollectionManager.fetch(arrSharedCollections)
])
.then(function(){
App.start();
})
アクセス:
その後、コレクションへのアクセスが必要なモジュールは CollectionManager.get( id ) を呼び出すだけです。
var collection = CollectionManager.get("groups"); //@return Backbone.Collection
これはある程度の構造を提供しますが、それがそれほど好きかどうかはわかりません。
アップデート
したがって、 Marionette のドキュメントを少し掘り下げた後、 Marionette.RequestResponse に気付きました。
これにより、モジュール内からデータを要求するためのクリーンな方法が提供され、私のアプローチに対して一定レベルの抽象化が作成され、厄介な方法で物事が結合されました。
したがって、次の行をアプリケーションに追加しました。
App.reqres.addHandler("getCollection", function (id) {
return CollectionManager.get(id);
})
次に、モジュール内から、次の方法でコレクションにアクセスします。
var collection = App.request("getCollection", "groups")
モジュール内から CollectionManager に直接アクセスするよりも、この方法が好きです。