關(guān)聯(lián)目錄索引:
重溫AngularJS(一)-- 表達式劈猪、指令
重溫AngularJS(二)-- 模型ng-model指令
重溫AngularJS(三)-- Scope(作用域)
重溫AngularJS(四)-- 控制器ng-controller
重溫AngularJS(五)-- 過濾器
重溫AngularJS(六)-- 服務Service
重溫AngularJS(七)-- Select(選擇框)曲稼、表格
重溫AngularJS(八)-- 事件
重溫AngularJS(九)-- 模塊觅闽、全局API
重溫AngularJS(十)-- 表單、輸入驗證
重溫AngularJS(十一)-- 包含辖所、動畫
重溫AngularJS(十二)-- 依賴注入(5個核心組件)
重溫AngularJS(十三)-- 路由
作者:Zyao89琼梆;轉(zhuǎn)載請保留此行,謝謝羽氮;
什么是依賴注入?
依賴注入(Dependency Injection宙项,簡稱DI)是一種軟件設計模式乏苦,在這種模式下,一個或更多的依賴(或服務)被注入(或者通過引用傳遞)到一個獨立的對象(或客戶端)中尤筐,然后成為了該客戶端狀態(tài)的一部分。
該模式分離了客戶端依賴本身行為的創(chuàng)建洞就,這使得程序設計變得松耦合盆繁,并遵循了依賴反轉(zhuǎn)和單一職責原則。與服務定位器模式形成直接對比的是旬蟋,它允許客戶端了解客戶端如何使用該系統(tǒng)找到依賴油昂。
AngularJS 提供很好的依賴注入機制。以下5個核心組件用來作為依賴注入:
- value
- factory
- service
- provider
- constant
value
Value 是一個簡單的 javascript 對象,用于向控制器傳遞值(配置階段):
// 定義一個模塊
var mainApp = angular.module("mainApp", []);
// 創(chuàng)建 value 對象 "defaultInput" 并傳遞數(shù)據(jù)
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 是一個函數(shù)用于返回值冕碟。在 service 和 controller 需要時創(chuàng)建拦惋。
通常我們使用 factory 函數(shù)來計算或返回值。
// 定義一個模塊
var mainApp = angular.module("mainApp", []);
// 創(chuàng)建 factory "MathService" 用于兩數(shù)的乘積 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
AngularJS 中通過 provider 創(chuàng)建一個 service安寺、factory等(配置階段)厕妖。
Provider 中提供了一個 factory 方法 get()
,它用于返回 value/service/factory挑庶。
// 定義一個模塊
var mainApp = angular.module("mainApp", []);
...
// 使用 provider 創(chuàng)建 service 定義一個方法用于計算兩數(shù)乘積
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(常量)用來在配置階段傳遞數(shù)值言秸,注意這個常量在配置階段是不可用的。
mainApp.constant("configParam", "constant value");
栗子:
以下實例提供了以上幾個依賴注入機制的演示迎捺。
<html>
<head>
<meta charset="utf-8">
<title>AngularJS 依賴注入</title>
</head>
<body>
<h2>AngularJS 簡單應用</h2>
<div ng-app = "mainApp" ng-controller = "CalcController">
<p>輸入一個數(shù)字: <input type = "number" ng-model = "number" /></p>
<button ng-click = "square()">X<sup>2</sup></button>
<p>結(jié)果: {{result}}</p>
</div>
<script src="http://apps.bdimg.com/libs/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>