我有一个HTML div,比如
<div id="loader-container" data-ng-controller="LoaderController" ng-show="shouldShow">
Some html design
</div>
在我的控制器中
angular.module('core').controller('LoaderController', ['$scope','$location', 'Authentication', '$rootScope',
function($scope,$location, Authentication, $rootScope) {
$scope.shouldShow = true;
}
]);
现在,我想隐藏另一个控制器的html div,这就是为什么我试图将另一个控制器的$ scope.shouldShow变量设为false。那我怎么做
$scope.shouldShow = false;
来自另一个控制器。有可能或任何其他方式。?
答案 0 :(得分:10)
每个控制器都会创建一个新的范围。
因此,在一个控制器中更改范围不会反映在其他控制器的范围内。
如果要跨控制器共享属性,请在$rootScope
上创建该变量并使用它。
在控制器中
$scope.$root.shouldShow = true; //or false
标记
<div ng-show="$root.shouldShow"></div>
答案 1 :(得分:4)
直接从不同的控制器操作$ scope范围的控制器并不是一个好主意。它会使你的控制器紧密耦合。
控制器之间通信的一种常用方法是使用发布 - 订阅模式的消息。
如果您的控制器位于完全独立的组件中,并且您只需要通知另一个控制器,则可以使用scope对象的$broadcast/$emit
和$on
方法从一个控制器广播消息并监听到不同控制器中的特定消息。当发生应该更改shouldShow
变量的操作时,您只需广播一条消息并让另一个控制器监听并对其进行操作。
控制器之间通信的另一种常用方法是使用角度服务,充当控制器之间的中介。
如果您的控制器是同一组件/模块的一部分,并且您需要在它们之间共享状态/行为,那么使用角度service
来封装该逻辑并公开它将是一种正常的方法(服务是Angular中的单身人士)。实现起来非常简单。
但是,由于不了解有关您的确切要求的更多详细信息,因此很难设计出合适的解决方案。
感谢@Callum Linington在评论中讨论备选方案。