【问题标题】:How to communicate between controllers of two different modules in AngularJs如何在AngularJs中两个不同模块的控制器之间进行通信
【发布时间】:2015-02-27 12:26:54
【问题描述】:

我想知道我们能否在 AngularJS 中的两个不同控制器之间进行通信。假设我有两个模块,
笨蛋:http://plnkr.co/edit/if0MQwlx9WHrD8XnMi2t?p=preview

    1. var app = angular.module('fistModule', []);
           app.controller('first', function ($scope) {
                $scope.firstMethod= function () {
                 //my code}
} )
    2. var newapp = angular.module('secondModule,[]');
           newapp.controller('second', function ($scope) {
              $scope.secondMethod= function () {
               //my code}

有没有办法在两个不同模块的控制器之间进行通信。

我的代码: JS:

angular.module('myApp', [])
  .controller('ParentCtrl', ['$scope',
    function($scope) {

      $scope.message = "Child updated from parent controller";

      $scope.clickFunction = function() {
        $scope.$broadcast('update_parent_controller', $scope.message);
      };
    }
  ]);
  angular.module('myNewApp', [])
  .controller('ChildCtrl', ['$scope',
    function($scope) {
      $scope.message = "Some text in child controller";

      $scope.$on("update_parent_controller", function(event, message) {
        $scope.message = message;
      });
    }
  ])

HTML:

<div ng-app="myApp" ng-controller="ParentCtrl">

    <div ng-app="myNewApp" ng-controller="ChildCtrl">
      <p>{{message}}</p>
    </div>

    <button ng-click="clickFunction()">Click</button>
  </div>

【问题讨论】:

  • 无论它们是否在同一个模块中都不会改变任何东西。
  • 这意味着我可以使用 $broadcast 在控制器之间进行通信。
  • 是的,这样做没问题。
  • @JBNizet 你可以为此创建一个示例。请..
  • 你这样做怎么样,如果你不成功就问一个问题?

标签: angularjs


【解决方案1】:

正如@JB Nizet 所说,您以完全相同的方式进行操作。您使用service 在两个控制器之间进行通信。

一个模块需要有另一个模块作为依赖。这始终是一种单向依赖。我已将secondModule 设为firstModule 的依赖项。

同样,服务中的value 存储在一个名为data 的对象中。这是因为 JavaScript 不通过引用传递值——而是通过引用传递对象。所以这是boxing 的一种形式。

angular.module('firstModule', ['secondModule'])
  .controller('FirstController', FirstController)
  .service('sharedData', SharedData);

FirstController.$inject = ['sharedData'];
function FirstController(sharedData) {
  
  this.data = sharedData.data;
}

function SharedData() {

  this.data = {
    value: 'default value'
  }

}

angular.module('secondModule', [])
  .controller('SecondController', SecondController);

SecondController.$inject = ['sharedData'];
function SecondController(sharedData) {
  
  this.data = sharedData.data;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="firstModule">

  <div ng-controller="FirstController as vm">
    First Controller in module firstModule<br>
    <input type=text ng-model="vm.data.value" />
  </div>

  <div ng-controller="SecondController as vm">
    Second Controller in module secondModule<br>
    {{vm.data.value}}
  </div>
</div>

【讨论】:

    【解决方案2】:

    你的 plunker 有一个非常小的问题。

    改变这个

         angular.module('myApp', [])
    

         angular.module('myApp', ['myNewApp'])
    

    【讨论】:

    • 它还有另一个问题:它尝试使用 ngApp 两次。 @ng_developer:阅读 ngApp 的文档:每个 HTML 文档只能自动引导一个 AngularJS 应用程序。在文档中找到的第一个 ngApp 将用于定义根元素以自动引导为应用程序
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多