AngularJS dependency injection
What is Dependency Injection
The explanation on wiki is: Dependency Injection (DI) is a software design pattern in which one or more Multiple dependencies (or services) are injected (or passed by reference) into a separate object (or client), and then become part of the client's state.
This pattern separates the creation of the client's own behavior, which makes the program design loosely coupled and follows the principles of dependency inversion and single responsibility. In direct contrast to the service locator pattern, it allows the client to understand how the client uses the system to find dependencies. you.
valueAngularJS provides a good dependency injection mechanism. The following 5 core components are used as dependency injection:
- factory
- service
- provider
- constant
- value
Value Yes A simple javascript object used to pass values to the controller (configuration phase):
// 定义一个模块
var mainApp = angular.module("mainApp", []);
// 创建 value 对象 "defaultInput" 并传递数据
mainApp.value("defaultInput", 5);
...
// 将 "defaultInput" 注入到控制器
mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
$scope.number = defaultInput;
$scope.result = CalcService.square($scope.number);
$scope.square = function() {
$scope.result = CalcService.square($scope.number);
}
});
factory
factory is a function that returns a value. Created when needed by services and controllers. Usually we use the factory function to calculate or return values.
// 定义一个模块 var mainApp = angular.module("mainApp", []); // 创建 factory "MathService" 用于两数的乘积 provides a method multiply to return multiplication of two numbers mainApp.factory('MathService', function() { var factory = {}; factory.multiply = function(a, b) { return a * b } return factory; }); // 在 service 中注入 factory "MathService" mainApp.service('CalcService', function(MathService){ this.square = function(a) { return MathService.multiply(a,a); } }); ...
provider
In AngularJS, create a service, factory, etc. (configuration phase) through provider. Provider provides a factory method get(), which is used to return value/service/factory.
// 定义一个模块 var mainApp = angular.module("mainApp", []); ... // 使用 provider 创建 service 定义一个方法用于计算两数乘积 mainApp.config(function($provide) { $provide.provider('MathService', function() { this.$get = function() { var factory = {}; factory.multiply = function(a, b) { return a * b; } return factory; }; }); });
constant
constant (constant) is used to pass values during the configuration phase. Note that this constant is not available during the configuration phase.
mainApp.constant("configParam", "constant value");
Examples
The following examples provide demonstrations of the above dependency injection mechanisms.
Instance
<html> <head> <meta charset="utf-8"> <title>AngularJS 依赖注入</title> </head> <body> <h2>AngularJS 简单应用</h2> <div ng-app = "mainApp" ng-controller = "CalcController"> <p>输入一个数字: <input type = "number" ng-model = "number" /></p> <button ng-click = "square()">X<sup>2</sup></button> <p>结果: {{result}}</p> </div> <script src="//cdn.bootcss.com/angular.js/1.4.6/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("defaultInput", 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, defaultInput) { $scope.number = defaultInput; $scope.result = CalcService.square($scope.number); $scope.square = function() { $scope.result = CalcService.square($scope.number); } }); </script> </body> </html>
Click the "Run Instance" button to view the online instance