はい、子セクションは、親が作成された後に常に呼び出す必要があります。直接の URL でアクセスしたか、Router ナビゲーションを介してアクセスしたかは関係ありません。
これに対する私の回避策は、常にアプリケーションにメイン ビューを持ち、ルーターは常にこのメイン ビューを呼び出すことです。Router は他のビューにアクセスできません。メイン ビューでは、親ビューが作成されているかどうかを処理できます。
例として、ルーターが MainView のみを呼び出す方法を確認します。必要に応じて親ビューを作成する validateCategories という名前のメソッドがあります。
var MainView = Backbone.View.extend({
id : 'mainView',
categories : null,
events : {
},
initialize : function(){
_.bindAll(this);
},
openSection : function(section){
switch(section){
case 'categories':
this.validateCategories();
break;
case 'products':
this.validateCategories();
this.categories.open( new ProductsView() );
break;
}
},
validateCategories : function(){
if( !this.categories ){
//we create the parent view only if not yet created
this.categories = new CategoriesView();
}
}
});
var mainView = new MainView();
var RouterClass = Backbone.Router.extend({
routes : {
"categories" : "viewCategories",
"categories/:id/:section" : "viewProducts"
},
viewCategories : function(path) {
mainView.openSection( 'categories' );
},
viewProducts : function(id, section){
mainView.model.set({
productId : id,
section : section,
});
mainView.openSection( 'products' );
}
});
また、新しいプロジェクトをゼロから始める場合は、Backbone.js プロジェクトを整理するのに役立つこの拡張機能を確認することを忘れないでください:
https://github.com/derickbailey/backbone.marionette