AngularJS 依赖注入


依赖注入是一种软件设计,其中组件被赋予其依赖关系,而不是在组件中硬编码它们。它使组件免于定位依赖项并使依赖项可配置。它还有助于使组件可重用、可维护和可测试。

AngularJS 提供了一种至高无上的依赖注入机制。它提供了以下核心组件,这些组件可以作为依赖项相互注入。

  • Value
  • Factory
  • Service
  • Provider
  • Constant

Value


Value 是一个简单的 JavaScript 对象,需要在配置阶段将值传递给控制器​​(配置阶段是 AngularJS 引导自身的时候)。

// 定义一个模块
var mainApp = angular.module("mainApp", []);

// 创建一个值对象作为“default输入”并将数据传递给它。
mainApp.value("default输入", 5);
...

// 使用名称“default输入”将值注入控制器
mainApp.controller('CalcController', function($scope, CalcService, default输入) {
    $scope.number = default输入;
    $scope.result = CalcService.square($scope.number);
   
    $scope.square = function() {
        $scope.result = CalcService.square($scope.number);
    }
});

Factory


Factory是一个用于返回值的函数。每当服务或控制器需要时,它都会按需创造价值。它通常使用工厂函数来计算并返回值。

// 定义一个模块
var mainApp = angular.module("mainApp", []);

// 创建一个工厂“MathService”,它提供了一个方法 multiply 来返回两个数字的乘积
mainApp.factory('MathService', function() {
    var factory = {};
   
    factory.multiply = function(a, b) {
        return a * b
    }
    return factory;
}); 

// 在服务中注入工厂“MathService”以利用工厂的乘法方法。
mainApp.service('CalcService', function(MathService) {
    this.square = function(a) {
        return MathService.multiply(a,a);
    }
});
...

Service


Service 是一个单例 JavaScript 对象,其中包含一组用于执行某些任务的函数。使用 service() 函数定义服务,然后将其注入控制器。

// 定义一个模块
var mainApp = angular.module("mainApp", []);
...

// 创建一个服务,它定义了一个方法 square 来返回一个数字的平方。
mainApp.service('CalcService', function(MathService) {
    this.square = function(a) {
        return MathService.multiply(a,a);
    }
});

// 将服务“CalcService”注入控制器
mainApp.controller('CalcController', function($scope, CalcService, default输入) {
    $scope.number = default输入;
    $scope.result = CalcService.square($scope.number);
   
    $scope.square = function() {
        $scope.result = CalcService.square($scope.number);
    }
});

Provider


Provider 被 AngularJS 在内部用于在配置阶段创建服务、工厂等。以下脚本可用于创建我们之前创建的 MathService。 Provider 是一种特殊的工厂方法,带有 get() 方法,用于返回值/服务/工厂。

// 定义一个模块
var mainApp = angular.module("mainApp", []);
...

// 使用提供者创建一个服务,该提供者定义了一个方法 square 来返回一个数字的平方。
mainApp.config(function($provide) {
    $provide.provider('MathService', function() {
        this.$get = function() {
            var factory = {};
         
            factory.multiply = function(a, b) {
                return a * b;
            }
            return factory;
        };
    });
});

Constant


考虑到在配置阶段不能使用值这一事实,常量用于在配置阶段传递值。

mainApp.constant("configParam", "constant value");

例子


下面的例子展示了上述所有指令的使用:

测试AngularJS.htm

<html>
    <head>
        <title>AngularJS Dependency Injection</title>
    </head>
   
    <body>
        <h2>AngularJS Sample Application</h2>
      
        <div ng-app = "mainApp" ng-controller = "CalcController">
            <p>Enter a number: <input type = "number" ng-model = "number" /></p>
            <button ng-click = "square()">X<sup>2</sup></button>
            <p>Result: {{result}}</p>
        </div>
      
        <script src = "https:// ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js">
        </script>
      
        <script>
            var mainApp = angular.module("mainApp", []);
         
            mainApp.config(function($provide) {
                $provide.provider('MathService', function() {
                    this.$get = function() {
                        var factory = {};
                  
                        factory.multiply = function(a, b) {
                            return a * b;
                        }
                        return factory;
                    };
                });
            });
			
            mainApp.value("default输入", 5);
         
            mainApp.factory('MathService', function() {
                var factory = {};
            
                factory.multiply = function(a, b) {
                    return a * b;
                }
                return factory;
            });
            mainApp.service('CalcService', function(MathService) {
                this.square = function(a) {
                    return MathService.multiply(a,a);
                }
            });
            mainApp.controller('CalcController', function($scope, CalcService, default输入) {
                $scope.number = default输入;
                $scope.result = CalcService.square($scope.number);

                $scope.square = function() {
                    $scope.result = CalcService.square($scope.number);
                }
            });
        </script>
      
    </body>
</html>

输出


Open 测试AngularJS.htm 在网络浏览器中查看结果。