Ответ 1
Подход, который вы использовали в вашем плункере, близок. @ben-schwartz демонстрирует, как вы задали значения по умолчанию в своем корневом состоянии для трех существенно статических представлений. Отсутствие в вашем плункере состоит в том, что вашим дочерним состояниям все равно необходимо ссылаться на вид верхнего контейнера.
.state('root',{
url: '',
views: {
'header': {
templateUrl: 'header.html',
controller: 'HeaderCtrl'
},
'footer':{
templateUrl: 'footer.html'
}
}
})
.state('root.about', {
url: '/about',
views: {
'[email protected]': {
templateUrl: 'about.html'
}
}
});
Примечание views: { '[email protected]': ...}
вместо templateUrl: ...
в 'root.about'
То, о чем вы также можете спросить, это то, могут ли модули определить свои собственные состояния, которые затем присоединяются к иерархии состояний приложения. Тип плагинов для маршрутов/состояний каждого модуля обеспечивает.
Чтобы достичь этого, вы будете тесно связывать свои модули с основным приложением.
В модуле:
angular.module('contact', ['ui.router'])
.constant('statesContact', [
{ name: 'root.contact',
options: {
url: 'contact',
views: {
'[email protected]': {
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')
)