使用服务定义基本的AngularJS控制器

时间:2013-08-21 04:43:10

标签: javascript angularjs

阅读文档并使用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

3 个答案:

答案 0 :(得分:1)

来自Angular's dev guide

  

注射器如何知道需要注射哪些服务?

     

(...)

     

推断依赖性

     

掌握最简单的方法   依赖关系,是假设函数参数名称是   依赖项的名称。

     

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)

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