次のようなショッピングカートのチェックアウトプロセスを本質的に模倣する一連のページ状態があります。
var ItemsCollection = Backbone.Collection.extend({
model: ItemModel,
url "/items"
});
var ItemsView = Backbone.View.extend({
// Select item on click event here
});
var ItemsApp = Backbone.View.extend({
// Fetch collection of items and render each ItemsView
});
アイテムが選択されたら、本質的に状態を変更して、そのアイテムのセラーをレンダリングしたいと考えました。アーキテクチャは次のようになります。
var SellersCollection = Backbone.Collection.extend({
model: SellersModel,
url "/sellers" // The item ID is stored in a session NOT in the url (So permalinks work)
});
var SellersView = Backbone.View.extend({
// Select item on click event here
});
var SellersApp = Backbone.View.extend({
// Fetch collection of sellers and render each SellersView
});
これら 2 つの状態が与えられた場合、Sellers コレクションをインスタンス化し、Sellers を取得してビューをレンダリングするためのベースとなる場所はどこでしょうか?
私は基本的に、SellersApp ビューと ItemsApp ビューを 1 つに組み合わせて、レンダリングするサブビューとフェッチするコレクションを決定する一種のコントローラーとして機能することを考えていました。そのようにする場合、メインアプリの名前空間で両方のコレクションをインスタンス化し、必要に応じてコレクションを取得するか、対応する状態 (url) が呼び出されたときにのみ各コレクションをインスタンス化する必要があります。後者のアプローチはデメテルの法則に違反していると思います。
どうすればいいと思います。
// 1. Instantiate outside the view
var MainApp = Backbone.View.extend({
attributes: {
"page": "items"
},
items: function(){
// Fetch items collection and render view (listenTo used in initialize)
},
sellers: function() {
// Fetch sellers
}
});
Items = new ItemsCollection;
Sellers = new SellersCollection;
これは良いアプローチですか?それが良いアプローチである場合、状態を変更するように MainApp に指示する必要があります。つまり、メイン アプリのフェッチ コレクション メソッドを明示的に呼び出す必要があります (つまり
、ItemsView の「クリック」イベントで、ItemsApp.sellers を明示的に宣言する必要があります)、またはリスナーを使用する必要があります。アイテムが選択されるのを自動的にリッスンするメイン アプリ ビューで。
私は基本的に、router.navigate - トリガーを使用し、ルーターを使用して各ビュー/コレクションをインスタンス化する代替手段を探しています。これは良い習慣ではないと聞いています。