在使用routeprovider时,在两个控制器之间调用函数。
在使用routeprovider时,在两个控制器之间调用函数。
我使用路由提供程序如下所示,
var appModule = angular.module('ngLogin', ['ngRoute','restangular','btford.socket-io','ngSanitize','xeditable']); appModule.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/home', { templateUrl: 'sample/homepage.html', controller: 'ngHomeControl' }). when('/contacts', { templateUrl: 'sample/homepage.html', controller: 'ngContactControl' }); }]);
在这里,我需要从ngHomeControl
调用函数到ngContactControl
。
我尝试了以下方法,但函数没有被调用。
appModule.controller('ngHomeControl', function($scope,$routeParams,socket,Restangular,$http) { $rootScope.$broadcast('getFriendList',{"userName":userName}); }); appModule.controller('ngContactControl', function($scope,$routeParams,$rootScope,socket,sharedProperties,Restangular,$http,$timeout) { $scope.$on("getFriendList",function(event,data) { console.log('getFriendList'); }); });
有人能帮我解决吗?
在使用routeprovider时,如果在/home页面上没有一个ngContactControl实例存在,那么你的事件侦听器将不会被触发。你可以创建一个父控制器来处理作用域事件,但更好的方法是使用一个在需要这个功能的控制器之间共享的服务。可以参考这个示例来了解如何通过服务来共享数据和/或函数。
问题的出现原因是在使用$routeProvider时,只有一个controller会被实例化,因此无法在两个controller之间调用函数。解决方法是使用一个service来实现两个controller之间的通信。下面是一个示例代码:
var appModule = angular.module('appModule', ['ngRoute']); appModule.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/home', { templateUrl: 'home.html', controller: 'ngHomeControl' }). when('/contacts', { templateUrl: 'contacts.html', controller: 'ngContactControl' }); }]); appModule.service('friendsService', function(){ this.getFriendList = function () { return ['John', 'James', 'Jake']; } }); appModule.controller('ngHomeControl', function($scope, friendsService) { $scope.homeFriends = friendsService.getFriendList(); }); appModule.controller('ngContactControl', function($scope, friendsService) { $scope.contactFriends = friendsService.getFriendList(); });
通过这种方式,我们可以在ngHomeControl和ngContactControl两个controller中使用同一个service来获取朋友列表。
为了测试这个解决方案,你可以访问这个JSFiddle链接。
在控制台输出中,你会看到每当路由更改时,控制器都会被实例化,而服务只会在第一次被需要或注入时实例化一次。
另外,如果你想在service中使用$scope,这是不可能的。另外,如果你在service中使用了restangular,并且返回了restangular的response值,它不会反映在$scope.homeFriends上。解决这个问题的方法是使用promises,将response值传递给controller,并在controller中使用$scope进行赋值操作。