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

How to use $emit and $on of angularjs for two different controller stored in different path

我有两个视图及其响应控制器。 说 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>

我想要的如果用户首先点击 link 那么它应该显示 view2.html 的第一个 div

或者

如果用户点击第二个 link 那么它应该显示 view2.html 的 sencod div 视图二有自己的第二个控制器。我在这里被击中了。 帮我解决这个问题。感谢你在期待。

我认为你不需要在这里发出,因为 firstCtrl 和 secondCtrl 是一个独立的控制器。如果您的范围之间没有 parent-child 关系,您可以将 $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>

parentCtrl

使用 $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;
 });