Angularjs我可以从另一个控制器更改控制器的$ scope值吗?

时间:2015-03-02 09:27:20

标签: javascript angularjs

我有一个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;

来自另一个控制器。有可能或任何其他方式。?

2 个答案:

答案 0 :(得分:10)

每个控制器都会创建一个新的范围。

因此,在一个控制器中更改范围不会反映在其他控制器的范围内。

如果要跨控制器共享属性,请在$rootScope上创建该变量并使用它。

在控制器中

$scope.$root.shouldShow = true; //or false

标记

<div ng-show="$root.shouldShow"></div>

答案 1 :(得分:4)

直接从不同的控制器操作$ scope范围的控制器并不是一个好主意。它会使你的控制器紧密耦合。

控制器之间通信的一种常用方法是使用发布 - 订阅模式的消息。

如果您的控制器位于完全独立的组件中,并且您只需要通知另一个控制器,则可以使用scope对象的$broadcast/$emit$on方法从一个控制器广播消息并监听到不同控制器中的特定消息。当发生应该更改shouldShow变量的操作时,您只需广播一条消息并让另一个控制器监听并对其进行操作。

Root Scope API

控制器之间通信的另一种常用方法是使用角度服务,充当控制器之间的中介。

如果您的控制器是同一组件/模块的一部分,并且您需要在它们之间共享状态/行为,那么使用角度service来封装该逻辑并公开它将是一种正常的方法(服务是Angular中的单身人士)。实现起来非常简单。

但是,由于不了解有关您的确切要求的更多详细信息,因此很难设计出合适的解决方案。

感谢@Callum Linington在评论中讨论备选方案。