在AngularJS中使用'范围'从另一个控制器调用一个控制器的方法

我想通过使用scopevariables调用第一个控制器中的第二个控制器的方法。 这是我第一个控制器中的一个方法:

 $scope.initRestId = function(){ var catapp = document.getElementById('SecondApp'); var catscope = angular.element(catapp).scope(); catscope.rest_id = $scope.user.username; catscope.getMainCategories(); }; 

我可以设置rest_id的值,但由于某种原因,我无法调用getMainCategories 。 控制台显示这个错误:

TypeError:对象#没有方法“getMainCategories”

有没有办法调用上述方法?

编辑:

我使用以下方法同时加载两个应用程序;

 angular.bootstrap(document.getElementById('firstAppID'), ['firstApp']); angular.bootstrap(document.getElementById('secondAppID'), ['secondApp']); 

我绝对可以在这里使用服务,但是我想知道是否还有其他的select可以做同样的事情!

在两个控制器之间进行通信的最佳方法是使用事件。

范围文件

在这个检查$on$broadcast$emit

在一般用例中, angular.element(catapp).scope()的用法被devise为在angular度控制器之外使用,就像在jquery事件中一样。

理想情况下,您可以在控制器1中写入一个事件:

 $scope.$on("myEvent", function (event, args) { $scope.rest_id = args.username; $scope.getMainCategories(); }); 

而在第二个控制器,你只是做

 $scope.initRestId = function(){ $scope.$broadcast("myEvent", {username: $scope.user.username }); }; 

编辑:实现了它是两个模块之间的通信

你可以尝试包括第一个应用firstApp模块作为你声明angular.modulesecondApp个应用程序的依赖angular.module 。 这样你可以与其他应用程序通信。

这里是很好的小提琴演示如何通过$scope.$on在指令和其他控制器中使用共享服务

HTML

 <div ng-controller="ControllerZero"> <input ng-model="message" > <button ng-click="handleClick(message);">BROADCAST</button> </div> <div ng-controller="ControllerOne"> <input ng-model="message" > </div> <div ng-controller="ControllerTwo"> <input ng-model="message" > </div> <my-component ng-model="message"></my-component> 

JS

 var myModule = angular.module('myModule', []); myModule.factory('mySharedService', function($rootScope) { var sharedService = {}; sharedService.message = ''; sharedService.prepForBroadcast = function(msg) { this.message = msg; this.broadcastItem(); }; sharedService.broadcastItem = function() { $rootScope.$broadcast('handleBroadcast'); }; return sharedService; }); 

同样,我们可以在指令中使用共享服务。 我们可以将控制器部分实现为指令并使用$scope.$on

 myModule.directive('myComponent', function(mySharedService) { return { restrict: 'E', controller: function($scope, $attrs, mySharedService) { $scope.$on('handleBroadcast', function() { $scope.message = 'Directive: ' + mySharedService.message; }); }, replace: true, template: '<input>' }; }); 

这里有三个我们的控制器,其中ControllerZero用作触发器来调用prepForBroadcast

 function ControllerZero($scope, sharedService) { $scope.handleClick = function(msg) { sharedService.prepForBroadcast(msg); }; $scope.$on('handleBroadcast', function() { $scope.message = sharedService.message; }); } function ControllerOne($scope, sharedService) { $scope.$on('handleBroadcast', function() { $scope.message = 'ONE: ' + sharedService.message; }); } function ControllerTwo($scope, sharedService) { $scope.$on('handleBroadcast', function() { $scope.message = 'TWO: ' + sharedService.message; }); } 

ControllerOneControllerTwo通过使用$scope.$on处理程序来更改监听message

每个控制器都有自己的范围,所以这就是你的问题。

有两个想要访问相同数据的控制器是您想要服务的经典标志 。 angular度团队build议在视图和服务之间粘合的精简控制器。 特别是“服务应该在控制器之间保持共享状态”。

令人高兴的是,有一个很好的15分钟video描述了这一点(通过服务控制器通信): video

Angular的原作者之一Misko Hevery在他题为Angular Best Practices的演讲(尽pipe我强烈build议观看整个演讲)中讨论了这个build议(在这种情况下使用服务)。

您可以使用事件,但它们只是为了希望进行分离的双方之间的通信而devise的。 在上面的video中,Misko指出他们如何让你的应用程序变得更加脆弱。 “大多数时候注入服务和进行直接沟通是首选和更强大的” 。 (查看上面的链接53:37开始听他讲这个)