Javascript 未使用$emit或$broadcast从一个控制器调用到另一个控制器的函数

Javascript 未使用$emit或$broadcast从一个控制器调用到另一个控制器的函数,javascript,angularjs,Javascript,Angularjs,首先,我认为我是新来的。我正在尝试从一个控制器调用一个函数到另一个控制器 使用ng click=mapUsers1事件发出2警报,但 如果不使用ng click=mapUsers1,则仅显示1个pop 这是棱角的特征还是我做错了 1.这与$emit有关 var-app=angular.module'myApp',[]; 应用程序控制器'myCtrl2',函数$scope,$rootScope{ $rootScope.$oncall\u映射用户\u方法,函数{ $scope.mapUsers;

首先,我认为我是新来的。我正在尝试从一个控制器调用一个函数到另一个控制器

使用ng click=mapUsers1事件发出2警报,但 如果不使用ng click=mapUsers1,则仅显示1个pop 这是棱角的特征还是我做错了

1.这与$emit有关

var-app=angular.module'myApp',[]; 应用程序控制器'myCtrl2',函数$scope,$rootScope{ $rootScope.$oncall\u映射用户\u方法,函数{ $scope.mapUsers; } $scope.mapUsers=函数{ 完成。。。。; } }; 应用程序控制器'myCtrl1',函数$scope,$rootScope{ $scope.mapUsers1=函数{ 警报“测试”; $rootScope.$emitcall_mapuusers_方法,{}; } $scope.mapUsers1; }; 点击
你不能这样。$emit函数将使一个事件气泡从作用域发射到根作用域

$emitname,args;=>通过作用域层次结构向上分派事件名称,通知已注册的$rootScope.scope侦听器

因此,您的事件不是从myCtrl1下降到myCtrl2

要向下发送事件,需要使用$broadcast

$broadcastname,args;=>将事件名称向下分派给所有子作用域及其子作用域 通知已注册的$rootScope.Scope侦听器的子项。同样的文件

这样做:

app.controller('myCtrl1', function($scope, $rootScope) {
    $scope.mapUsers1 = function() {
        alert('test');
        $rootScope.$broadcast("call_mapUsers_Method", {});
    }

    $scope.mapUsers1();
});
在父myCtrl1控制器init上激发$scope.mapUser1时,子控制器myCtrl2未初始化。这就是为什么您的子控制器$rootScope.$on此时不在侦听。您需要触发一个新的数字周期,例如使用$timeout:

在我看来,您应该使用工厂或服务在不同的控制器之间进行通信。此答案将帮助您:

>


Downvoter,您可以自由建议任何修改。。。。!,首先感谢您的回复,我已经用$emit和$broadcast添加了这两个场景。我的目标是在不点击按钮的情况下显示2个弹出窗口。我想林给了你一个很好的答案。您需要延迟事件的广播,直到第二个控制器初始化。顺便说一句,lin告诉您应该使用服务共享您案例中的数据是正确的。AngularJS事件应该是最后的救星:Dtanks lin,你的答案非常有用,但目前我无法投票支持你的答案。
var app = angular.module('myApp', []);

app.controller('myCtrl2', function($scope, $rootScope) {

  $rootScope.$on("call_mapUsers_Method", function() {
    $scope.mapUsers();
  });

  $scope.mapUsers = function() {
    alert("done....");
  }
});

app.controller('myCtrl1', function($scope, $rootScope, $timeout) {
  $scope.mapUsers1 = function() {
    alert('test');
    $rootScope.$broadcast("call_mapUsers_Method", {});
  }

  $timeout(function() {
    $scope.mapUsers1();
  });
});