Простите, если это глупый вопрос, но я новичок в AngularJS, и для жизни я не могу понять, почему эта вложенная настройка представления работает не так, как ожидалось.Несколько вложенных состояний AngularJS ui-router
У меня есть верхнего уровня <div>
:
<div class="grid" ui-view></div>
Который имеет модуль населяющих его вид:
angular.module('planttheidea',[
'ui.router',
'planttheidea.header',
'planttheidea.mainContent',
'planttheidea.footer'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider,$urlRouterProvider){
$stateProvider
.state('base',{
url:'',
views:{
'':{
templateUrl:'app/layout.view.html',
controller:'LayoutCtrl'
}
}
});
$urlRouterProvider.otherwise('/');
}])
.controller('LayoutCtrl',function LayoutCtrl($scope,$stateParams){
var layout = this;
});
Я тогда содержимое этой точки зрения компоновки:
<header ui-view="header" class="header menubar col-p-100" ng-controller="HeaderCtrl"></header>
<main ui-view="main-content" class="main-content grid col-p-100" ng-controller="MainContentCtrl"></main>
<footer ui-view="footer" class="footer col-p-100" ng-controller="FooterCtrl"></footer>
И прямо сейчас у меня есть верхний и нижний колонтитулы со своими модулями:
angular.module('planttheidea.header',[
'planttheidea.header.menu'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.header',{
url:'',
views:{
'[email protected]':{
templateUrl:'app/components/header/header.view.html',
controller:'HeaderCtrl as layoutHeaderCtrl'
}
}
});
}])
.controller('HeaderCtrl',function HeaderCtrl($scope,$stateParams){
var layoutHeaderCtrl = this;
});
angular.module('planttheidea.footer',[])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.footer',{
url:'',
views:{
'[email protected]':{
templateUrl:'app/components/footer/footer.view.html',
controller:'FooterCtrl as layoutFooterCtrl'
}
}
});
}])
.controller('FooterCtrl',function FooterCtrl($scope,$stateParams){
var layoutFooterCtrl = this;
});
Вы можете видеть, что они почти идентичны. Модуль заголовка работает отлично (у него даже есть собственный вложенный ui-view для меню, который работает очень хорошо), однако код нижнего колонтитула не маршрутизирует ui-view. Что еще wackier, что если я скопировать и вставить код колонтитула в модуль заголовка (используя только base.header
состояние), она работает по желанию:
angular.module('planttheidea.header',[
'planttheidea.header.menu'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.header',{
url:'',
views:{
'[email protected]':{
templateUrl:'app/components/header/header.view.html',
controller:'HeaderCtrl as layoutHeaderCtrl'
},
'[email protected]':{
templateUrl:'app/components/footer/footer.view.html',
controller:'FooterCtrl as layoutFooterCtrl'
}
}
});
}])
.controller('HeaderCtrl',function HeaderCtrl($scope,$stateParams){
var layoutHeaderCtrl = this;
})
.controller('FooterCtrl',function FooterCtrl($scope,$stateParams){
var layoutFooterCtrl = this;
});
Я подтверждено код загружается правильно (я сделал console.log()
в контроллере нижнего колонтитула, чтобы убедиться, что он работает вообще), поэтому я думаю, что это должно быть разделение на два модуля. Нужно ли объявлять все представления макета в одном и том же состоянии или есть способ разбить их на отдельные модули, как я здесь сделал? Я должен полагать, что это возможно, потому что я сделал это с вложенным модулем меню, однако это было вложенным, тогда как нижний колонтитул параллелен, поэтому я беспокоюсь, что это может быть проблемой.
Любая помощь была бы очень признательна, но имейте в виду, что я участвую в процессе обучения AngularJS, поэтому, если рабочий код будет потрясающим (очевидно), объяснение того, почему было бы еще более удивительным.
Последний параграф дал мне паузу, поэтому я отступил назад и понял, что делаю вековую ошибку чрезмерного абстрагирования. Я пришел к включению шаблонов, очень похожих на PHP 'require_once', но состояние - это просто ... состояние приложения, а верхний/нижний колонтитул не отражают изменения состояния. Я основывался на этом понимании, и все работает так, как ожидалось. Принято, потому что никто больше не должен тратить время на мою ошибку и поддерживаться, потому что он указал мне в правильном направлении. Благодаря! – PlantTheIdea
Без проблем, рад, что у вас все работает! –