0

我正在使用路由提供程序,如下所示,

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'
                  });
            }]);

在这里我需要从 to 调用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');
        });
});

谁能帮我解决?

4

2 回答 2

2

这将不起作用,因为一次仅实例化一个控制器(在您的情况下)。

正确的方法是使用服务。有一篇很好的文章可以帮助你解决这个问题。

另请参阅有关如何创建服务的答案。

基于这两个资源,你应该想出类似的东西:

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();
});

有一个完整的工作JSFiddle,因此您可以对其进行测试。还请检查控制台输出以查看使用的组件何时被实例化。

您将看到每次路由更改时都会实例化控制器 - 它们是通过ngController模板内使用的指令隐式实例化的。该服务仅实例化一次,这是第一次需要/注入它的时候。

于 2014-03-12T07:41:27.663 回答
1

您的事件侦听器没有被触发的原因是因为在您的 at 时没有ngContactControl活动的实例/home。您可以创建一个处理范围事件的父控制器,但更好的方法是使用在需要此功能的控制器之间共享的服务。

有关如何通过服务共享数据和/或功能的示例,请参阅此 plunker 。

于 2014-03-12T07:41:47.190 回答