您在 plunker 中采用的方法很接近。@ben-schwartz 的解决方案演示了如何在根状态下为三个基本静态视图设置默认值。您的 plunker 中缺少的东西是您的子状态仍然需要引用顶部容器视图。
.state('root',{
url: '',
views: {
'header': {
templateUrl: 'header.html',
controller: 'HeaderCtrl'
},
'footer':{
templateUrl: 'footer.html'
}
}
})
.state('root.about', {
url: '/about',
views: {
'container@': {
templateUrl: 'about.html'
}
}
});
注意views: { 'container@': ...}
而不是仅仅templateUrl: ...
在'root.about'
您可能还想问的是您是否可以让模块定义自己的状态集,然后将其附加到应用程序的状态层次结构中。每个模块提供的路由/状态的一种即插即用。
为了实现这一点,您需要将模块紧密耦合到主应用程序。
在模块中:
angular.module('contact', ['ui.router'])
.constant('statesContact', [
{ name: 'root.contact',
options: {
url: 'contact',
views: {
'container@': {
templateUrl: 'contacts.html'
}
},
controller:'ContactController'
}}
])
.config(['$stateProvider', function($stateProvider){
}])
然后,在应用程序中:
var app = angular.module('plunker', ['ui.router', 'contact']);
app.config( ['$stateProvider', 'statesContact',
function($stateProvider, statesContact){
$stateProvider
.state('root',{ ... })
.state('root.home', { ... })
.state('root.about', { ... })
angular.forEach(statesContact, function(state) {
$stateProvider.state(state.name, state.options);
})
}]);
这意味着您的所有模块都需要与您的应用程序中设置的这种模式兼容。但是如果你接受这个约束,你可以选择包含你的模块的任何组合,它们的状态会神奇地添加到你的应用程序中。如果你想变得更漂亮,你可以state.options.url
在你的statesModuleName
循环中修改,例如,为你的模块的 url 结构添加前缀。
另请注意,该模块ui.compat
仅在您从过渡$routeProvider
到时才需要$stateProvider
。您通常应该ui.state
改用。
也不要忘记在 header.html 中进行调整$state.includes('root.contact')
)
更新plunker