У меня есть приложение, которое я создаю с помощью angular, у меня есть около 8-10 просмотров для создания. Все представления имеют общий нижний колонтитул, основанный на представлении и наборе бизнес-правил, которые мне нужно условно показать/скрыть часть содержимого на нижнем колонтитуле.
Итак. У меня есть контроллеры для каждого вида, а затем один для нижнего колонтитула. Я включаю общий макет нижнего колонтитула с помощью ng-include, где html, который я включаю, ссылается на контроллер нижнего колонтитула в ng-контроллере.
Index.html
<body ng-controller="MainCtrl as vm">
<p>Message from Main Controller '{{vm.mainMessage}}'</p>
<div ng-include="'commonFooter.html'"></div>
</body>
commonFooter.html
<div ng-controller="FooterCtrl as vm">
<p>Message from Footer Controller '{{vm.message}}'</p>
<p ng-show="vm.showSomthing">Conditional footer Content</p>
</div>
Я хочу, чтобы каждый контроллер просмотров определял состояние нижнего колонтитула и скрывал ли конкретный контент или нет. (shouldDisplaySomthingInFooter ниже)
app.controller('MainCtrl', function($scope) {
var vm = this;
vm.mainMessage= 'HEELO';
vm.shouldDisplaySomthingInFooter = true;
window.console.log('Main scope id: ' + $scope.$id);
});
Затем я предположил, что в FooterController вернется в родительский контроллер и вытащит конкретные настройки для включения/отключения содержимого на основе бизнес-правил.
app.controller('FooterCtrl', function($scope) {
var vm = this;
vm.message = 'vm footer';
window.console.log('Footer scope id: ' + $scope.$id);
window.console.log('Footer parent scope id: ' + $scope.$parent.$id);
window.console.log('Footer grandparent scope id: ' + $scope.$parent.$parent.$id);
window.console.log('Footer grandparent scope name: ' + $scope.$parent.$parent.mainMessage);
window.console.log('Footer grandparent scope condition: ' + $scope.$parent.$parent.shouldDisplaySomthingInFooter);
vm.showSomthing = false; //how to pull from parent scope to bind the ng-show to a value set in the parent from within a ng-include?
});
У меня есть этот пример здесь: http://plnkr.co/edit/ucI5Cu4jjPgZNUitY2w0?p=preview
То, что я нахожу, это то, что я, когда попадаю в родительскую область, вытягиваю содержимое, возвращаемое как undefined, и я не уверен, почему.
Я вижу, что области привязаны к уровню grandparent, проверяя scopeid, я считаю, что это связано с тем, что ng-include добавляет дополнительный уровень видимости под областями представления.
Дополнительные баллы: если мне не нужно использовать объект $scope и можете придерживаться способа var vm = this;
сделать это, что было бы предпочтительнее. Но нищие не могут выбирать:)
app.controller('MainCtrl', function($scope) {
var vm = this;
Спасибо вам заблаговременно.