是的,无论是通过直接 url 还是通过路由器导航访问,都必须在创建父级后始终调用子级。
我的解决方法是在我的应用程序中始终有一个主视图,并且路由器总是调用这个主视图。路由器无权访问其他视图。在我的主视图中,我可以处理创建或不创建父视图的情况。
例如,检查路由器如何只调用 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