【发布时间】:2015-01-21 03:43:51
【问题描述】:
我有一个使用 Angular 构建的应用程序,我有大约 8-10 个视图要构建。 所有视图都有一个共享的页脚,基于视图和一组业务规则,我需要有条件地显示/隐藏页脚上的一些内容。
所以。 我有每个视图的控制器,然后是页脚的控制器。 我使用 ng-include 包含常见的页脚布局,其中我包含的 html 引用了 ng-controller 中的页脚控制器。
索引.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>
我希望每个视图控制器确定页脚的状态以及特定内容是否隐藏。 (应在下方显示SomthingInFooter)
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
我发现当我进入父范围以提取内容时,它会以未定义的形式返回,我不知道为什么。
我可以通过检查 scopeid 看到范围嵌套到祖父级别,我相信这是因为 ng-include 在视图范围下方添加了一个额外的范围层。
加分:如果我不必使用 $scope 对象并且可以坚持使用var vm = this; 的方式,那就更好了。但乞丐不能挑剔:)
app.controller('MainCtrl', function($scope) {
var vm = this;
非常感谢您。
【问题讨论】:
标签: javascript angularjs angularjs-scope angularjs-ng-include