如何对存储在不同路径中的两个不同控制器使用$ emit和$ on of angularjs

时间:2017-01-14 05:45:10

标签: angularjs angularjs-scope emit

我有两个视图及其resp控制器。 说 view1.html及其控制器firstCntrl 和 view2.html及其控制器secndCntrl。

view1.html

如果单击了Link2,它将被重定向到view2.html。

<a href="#/view1" ng-click="emit()">Link1</a>  
<a href="#/view2" ng-click="emit()">Link2</a>

在ng-click中我正在调用emit函数,我将$ emit定义为 的 firstCntrl.js

 app.controller("firstCntrl", function ($scope) {
    $scope.emit = function() {
      $scope.$emit('send', { message: 'true' });
    };
 });

我想从这里发送true并在$ on中捕获它。

view2.html

有两个div。说div和div二。

<div ng-show="one">Hello</div>
<div ng-show="two">World</div>

我想要的是如果用户点击第一个链接,那么它应该显示view2.html的第一个div

或者

如果用户点击第二个链接,那么它应该显示view2.html的sencod div 查看两个有自己的Secnd控制器。我很震惊。 帮助我这个如何做到这一点。感谢你在期待。

1 个答案:

答案 0 :(得分:0)

我认为你不需要发射,因为firstCtrl和secondCtrl是一个独立的控制器。如果您的范围之间没有父子关系,您可以将$ rootScope注入控制器并将事件广播到所有子范围。

<强> View1.html

<a href="#/view1" ng-click="broadcastMsg(1)">Link1</a>  
<a href="#/view2" ng-click="broadcastMsg(2)">Link2</a>

<强> firstCtrl

app.controller("firstCntrl", function ($scope, $rootScope) {
    $scope.broadcastMsg = function(id) {
      if (id == 1) 
          $rootScope.$broadcast('send', 'One');
      else 
          $rootScope.$broadcast('send', 'Two');
    };
 });

<强> View2.html

<div ng-show="showOne">Hello</div>
<div ng-show="!showOne">World</div>

<强> parentCntrl

使用$ scope.on而不是$ rootScope.on来防止内存泄漏问题。

app.controller("parentCntrl", function ($scope, $rootScope) {
      $scope.$on('send', function (evt, message) {
            if (message == 'One') 
                $scope.showOne = true;
            else
                $scope.showOne = false;
      });
 });

<强> secondCtrl

app.controller("secondCntrl", function ($scope) {
      $scope.showOne = $scope.$parent.showOne;
 });
相关问题