Javascript 未使用$emit或$broadcast从一个控制器调用到另一个控制器的函数
首先,我认为我是新来的。我正在尝试从一个控制器调用一个函数到另一个控制器 使用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; }; 点击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;
你不能这样。$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();
});
});