0

阅读文档并使用 jsfiddle,我注意到控制器以下列方式定义(和工作)*:

function InvoiceCntl( $scope ) {...}
function Ctrl2( $scope, $timeout ) {...}
function countController1( $scope, $http, $timeout ) {...}
function countController2( $scope, $timeout, $http ) {...}

我的问题是关于调用我的控制器的 AngularJS 库的一部分:它如何知道我期望的服务以及我的控制器期望它们的顺序?

这是 JavaScript,Jim,但不是我们所知道的。

*请记住,控制器不应在全局范围内定义

4

3 回答 3

1

来自Angular 的开发指南

注入器如何知道需要注入什么服务?

(...)

推断依赖关系

获取依赖项的最简单方法是假设函数参数名称是依赖项的名称。

函数 MyController($scope, greeter) { ... }

给定一个函数,注入器可以通过检查函数声明并提取参数名称来推断要注入的服务的名称。在上面的例子中,$scope 和 greeter 是两个需要注入到函数中的服务。

当您的代码需要缩小时,情况并非如此。检查开发指南(上面的链接)中的“$inject Annotation”部分以更好地理解它。

于 2013-08-21T04:57:07.277 回答
1

默认情况下,AngularJS 注入器服务会将控制器函数的参数名称与内置 AngularJS 服务的名称进行匹配(以$符号开头):

// Old way to define your controller
angular.module('yourModule')
    .controller('yourController', function($scope, $http, yourService){

        // Your code here

    });

但是,由于这只是基于字符串比较,因此当您的代码被丑化和/或缩小时,这可能会导致问题。

因此,建议您使用较新的语法来使用数组表示法创建控制器,如下所示:

// Newer, better way to define your controller
angular.module('yourModule')
    .controller('yourController', ['$scope', '$http', 'yourService', function($scope, $http, yourService){

        // Your code here

    }]);

请注意,控制器函数被替换为一个数组,该数组包含您要注入的服务并以控制器函数结束。

AngularJS 现在将按照您在数组中指定的顺序注入服务,如下所示:

['yourService', 'yourOtherService', function(yourService, yourOtherService){

    // You can use yourService and yourOtherService here
}]

名称不必对应,因此您可以使用:

['$http', '$scope', function(h, s){

    // You can use h and s here
    // h will be the $http service, s will be the $scope
}]

强烈建议使用较新的数组表示法,因为它保证您的代码在缩小或丑化后仍然可以工作。

希望有帮助!

于 2013-08-21T05:54:57.820 回答
0

控制器不希望它们按任何顺序排列!它们仅使用可以按任何顺序排列的服务名称来标识它们。

于 2013-08-21T05:52:46.070 回答