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 在网络浏览器中查看结果。