阅读文档并使用jsfiddle,我注意到控制器的定义(和工作)方式如下*:
function InvoiceCntl( $scope ) {...}
function Ctrl2( $scope, $timeout ) {...}
function countController1( $scope, $http, $timeout ) {...}
function countController2( $scope, $timeout, $http ) {...}
我的问题是关于调用我的控制器的AngularJS库的一部分:它如何知道我期望的服务以及我的控制器期望它们的顺序?
这是JavaScript,Jim,但不是我们所知道的。
<子> *bearing in mind that controllers shouldn't be defined in the global scope 子>
答案 0 :(得分:1)
注射器如何知道需要注射哪些服务?
(...)
推断依赖性
掌握最简单的方法 依赖关系,是假设函数参数名称是 依赖项的名称。
function MyController($ scope,greeter){...}
给定一个功能 注入器可以通过检查来推断要注入的服务的名称 函数声明和提取参数名称。在上面 示例$ scope和greeter是需要注入的两个服务 进入功能。
当您的代码需要缩小时,这不会成立。检查开发指南(上面的链接)中的“$ inject Annotation”部分,以便更好地理解它。
答案 1 :(得分: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
}]
强烈建议使用较新的数组表示法,因为它可以保证您的代码在缩小或放大后仍能正常工作。
希望有所帮助!
答案 2 :(得分:0)
控制器不希望它们处于任何顺序!他们只使用可以按任何顺序排列的服务的名称来识别它们。