调用全局函数

时间:2014-01-17 14:45:24

标签: angularjs cordova angularjs-directive

我来找你,因为我不知道如何访问两个不同的控制器到全局功能。

我尝试访问应该被称为两个不同控制器的泛型函数。断开连接功能允许您断开与应用程序的连接,但也可以重置全局变量。

  1. controller_1和controller_2:

    function CONTROLLER_1 ($scope, $rootScope) {
         $scope.disconnect = function() {
              // RESET $rootScope variable
              $rootScope.var1 = 0;
              $rootScope.var2 = 0;
              etc...
         };
    }
    
    function CONTROLLER_2 ($scope, $rootScope) {
         $scope.disconnect = function() {
              // RESET $rootScope variable
              $rootScope.var1 = 0;
              $rootScope.var2 = 0;
              etc...
         };
    }
    
  2. 我想要这样的事情:

    function CONTROLLER_1 ($scope, $rootScope) {
         $scope.disconnect = function() {
              //CALL GLOBAL_METHOD
         }
    }
    
    function CONTROLLER_2 ($scope, $rootScope) {
         $scope.disconnect = function() {
              //CALL GLOBAL_METHOD
         }
    }  
    
    
    My GLOBAL_METHOD {
         // RESET $rootScope variable
         $rootScope.var1 = 0;
         $rootScope.var2 = 0;
         etc... 
    }         
    
  3. 在这种情况下是否有可能有类似的解决方案? 如果我不够精确,请不要犹豫,向我询问更多信息

    感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您似乎应该使用服务:

我可以看到两种解决方案:

1°)由于每个控制器都继承自rootScope,您可以在rootScope上定义断开功能,您可以自动调用断开连接:

angular.module('app').run(['$rootScope', function($rootScope) {
    $rootScope.disconnect = function() {
        $rootScope.var1 = 0;
        $rootScope.var2 = 0;
    };
}]);

angular.controller('Ctrl1', ['$scope', '$rootScope', function($scope, $rootScope) {
    // Disconnect function is already define
    $scope.applyDisconnect = function() {
        $scope.disconnect(); // Or $rootScope.disconnect();
    };
}]);

angular.controller('Ctrl2', ['$scope', '$rootScope', function($scope, $rootScope) {
    // Disconnect function is already define
}]);

注意,不应重新定义断开连接功能。

看到这个小提琴:http://jsfiddle.net/37cMw/2

2°)使用专用服务并将其注入控制器:

angular.module('myApp').service('DisconnectService', ['$rootScope' function($scope) {
    this.disconnect = function() {
        $rootScope.var1 = 0;
        $rootScope.var2 = 0;
    };
}]);

angular.module('myApp').controller('Ctrl1', ['$scope', 'DisconnectService', function($scope, service) {
    $scope.disconnect = function() {
        service.disconnect();
    };
}]);

angular.module('myApp').controller('Ctrl2', ['$scope', 'DisconnectService', function($scope, service) {
    $scope.disconnect = function() {
        service.disconnect();
    };
}]);

看到这个小提琴:http://jsfiddle.net/QFvyj/

第二个解决方案是我最喜欢的,因为你没有污染rootScope命名空间。

答案 1 :(得分:1)

是的,你可以!将方法添加到模块的.run

angular.module('app').run(function($rootScope) {
 $rootScope.GLOBAL_METHOD = function() {
  //YOUR STUFF    
 })
})

您可以从每个控制器调用此方法,如下所示:

$rootScope.GLOBAL_METHOD();

所以在你的情况下:

function CONTROLLER_1 ($scope, $rootScope) {
     $scope.disconnect = function() {
          $rootScope.GLOBAL_METHOD();
     }
}

function CONTROLLER_2 ($scope, $rootScope) {
     $scope.disconnect = function() {
          $rootScope.GLOBAL_METHOD();
     }
}  

答案 2 :(得分:0)

虽然user2874153提供的解决方案可能有效,但最好避免污染$rootScope。要在控制器之间共享功能,您应该创建一个服务。

您还应该避免在全局命名空间中声明控制器,而应该使用angular.module语法(请参阅http://docs.angularjs.org/guide/controller#setting-up-the-initial-state-of-a-object,其中的部分显示为“注意:”)

angular.module('myApp', []);

angular.module('myApp')
  .controller('OneCtrl', function ($scope, SharedService) {
    SharedService.doSomething();
  });

angular.module('myApp')
  .controller('TwoCtrl', function ($scope, SharedService) {
    SharedService.doSomething();
  });

angular.module('myApp')
  .service('SharedService', function () {
    return {
      doSomething: function () {
        // do something here.
      }
    };
  });