理解Angular中的语法

时间:2017-02-03 00:43:53

标签: angularjs

我已经在Angular中编写了一段时间的编码,到目前为止我已经创建了模块,控制器和服务,但我最近遇到了一段我无法理解的代码。这是别人的代码,我认为作者试图定义一个服务但不像我创建的那样。通常,当我创建服务时,它看起来如下所示:

app.factory('portabilityService', [
    '$resource', '$state', '$rootScope', function ($resource, $state, $rootScope) {
        return { //definition      };
    }
]);  
  • 对我来说,简单地指定服务名称作为Factory中的第一个参数,然后是所有依赖项,然后就可以了。

现在,我遇到了一些其他代码,如下所示:

(function () {
    /*
     * Manages which samples have been selected
     */


'use strict';

    angular.module('maintenance.portability.module')
        .factory('selectedSamplesSvc', service);

    service.$inject = [];

function service()
{
 //other function definitions
};

     })();

现在,这提出了很多问题:

  • 首先,这真的是一项服务吗?
  • 如果是,那么什么是服务。$ inject = []?
  • 我应该在哪里添加依赖项?
  • 构造函数service()的目的是什么?
  • 这是创建服务的另一种方式,还是我们应该以这种特定方式定义服务的具体原因?

2 个答案:

答案 0 :(得分:2)

所有答案归结为:它们与传递给.factory 的函数的等效定义相同。

  1. 是的,它是一项服务(基于先前的声明)
  2. $inject是您[ names..., function(dependencies...) {...}]语法
  3. 的替代方案
  4. 刚才你的功能定义是分开的。
  5. 这是您匿名传递的功能
  6. 大部分偏好,但明确的$inject有利于最小化
  7. 关于此事的其他考虑因素(部分)和总体良好的阅读情况,请看style guide

答案 1 :(得分:2)

我会尝试按顺序解决您的问题:

首先,是的,这绝对是一种声明服务的方式。它与您通常习惯使用的东西并不完全相同。

angular中声明的常规语法是:

typeOfDeclaration('stringNameOfDeclaration', functionDeclaration);

function functionDeclaration(){..};

在JavaScript中,函数是一个对象,因此可以使用匿名函数代替functionDeclaration,例如:

typeOfDeclaration('stringNameOfDeclaration', function(){..});

当你只做一个声明时,这个内联声明通常更容易编写,并且是大多数教程示例的事实标准。

注意这些规则适用于所有角度组件(providersfiltersdirectivescontrollers等等。)

通过将函数声明为单独的对象而不是内联,声明和函数更容易管理。理论上,您可以将函数本身放入不同的文件中(尽管这并不常见)。此外,如果您声明了多个函数,则此语法允许您将声明组合在一起并将函数组合在一起,这主要是首选项和编码样式。

示例中的 可选 依赖项数组是在代码缩小的情况下管理依赖注入的一种方法。在这种情况下,使用另一种替代DI方法service.$inject = [];。可以使用此数组代替内联数组,即service.$inject = ['$resource', '$state', '$rootScope'];同样,这为您提供了一种方法,可以将声明分组到一个位置,将依赖项分组到另一个位置。