嵌套angularjs控制器:一个控制器如何与另一个控制器通信?

时间:2014-08-12 16:21:29

标签: angularjs angularjs-scope

这是我的html视图:

<div id="chatContainer">
    <div id="users" ng-controller="usersController">
        <div ng-repeat="user in users" class="userItem">{{user.username}}</div>
    </div>

    <div id="chatText" ng-controller="chatTextController">
        <div ng-repeat="text in texts" class="text">{{text.text}}</div>
    </div>

    <div id="chatInput" ng-controller="chatInputController">
        <input type="text" placeholder="Enter chat text here" id="chatInputTxt" ng-model="chatInputTxt">
    </div>
</div>

我的目标是编写chatInputController控制器,这样当用户输入chatInputTxt时,chatTextController中的文本会更新,说的不同:

chatInputController如何访问/与chatTextController进行通信?

此致

3 个答案:

答案 0 :(得分:0)

您不应该尽可能使用$emit$broadcast,因为需要这些服务的服务越多,您可以进行更多的故障排除。

Angular.js中的嵌套控制器会自动收到父母范围的副本。要回答您的问题,全部是自动的。

<div ng-controller="controller1">
  {{mySharedValue}} // bar
  <div ng-controller="controller2">
    {{mySharedValue }} // also bar
  </div>
</div>

... JS

function controller1($scope) { $scope.mySharedValue = foo; $scope.notify = function() {
   console.log("I'm notified!") 
}; }
function controller2($scope) { $scope.mySharedValue = bar; $scope.notify(); // logs "i'm notified!" }

答案 1 :(得分:-1)

您有几个选择:

  1. 您可以使用$broadcast$on与兄弟控制器进行通信
  2. 您有一个父控制器,您可以在该控制器上设置要与子控制器共享的对象(只需确保您了解Angular $ scope继承,否则事情会很快变得混乱)。 - https://github.com/angular/angular.js/wiki/Understanding-Scopes
  3. 使用共享服务从每个控制器访问

答案 2 :(得分:-1)

您可以使用$ emit或$ broadcast来生成事件并传递一些数据。

  • $ broadcast - 将事件向下发送到所有子范围。

  • $ emit - 通过范围层次结构向上发送事件。

    $ scope。$ broadcast(&#39; eventName&#39;,param1,param2);

    所以你可以从$ rootScope广播。然后在另一个控制器中使用

    $ scope。$ on(&#39; eventName&#39;,function(param1,param2){ })

    赶上活动。

您还可以在每个控制器中使用服务并在服务上设置监视。或者您可以拥有父控制器,而不是污染rootScope并从父控制器进行广播。

如果通信只是一种方式,从子范围到父范围,那么emit将从子控制器工作。