### 14.3. 定義服務
服務本身是一個任意的對象。但是 _ng_ 提供服務的過程涉及它的依賴注入機制。在這里呢,就要先介紹一下叫 _provider_ 的東西。
簡單來說, _provider_ 是被“注入控制器”使用的一個對象,注入機制通過調用一個 _provider_ 的 _$get()_ 方法,把得到的東西作為參數進行相關調用(比如把得到的服務作為一個 _Controller_ 的參數)。
在這里“服務”的概念就比較不明確,對使用而言,服務僅指 _$get()_ 方法返回的東西,但是在整體機制上,服務又要指提供了 _$get()_ 方法的整個對象。
//這是一個provider
var pp = function(){
this.$get = function(){
return {'haha': '123'};
}
}
//我在模塊的初始化過程當中, 定義了一個叫 PP 的服務
var app = angular.module('Demo', [], function($provide){
$provide.provider('PP', pp);
});
//PP服務實際上就是 pp 這個 provider 的 $get() 方法返回的東西
app.controller('TestCtrl',
function($scope, PP){
console.log(PP);
}
);
上面的代碼是一種定義服務的方法,當然, _ng_ 還有相關的 shortcut, _ng_ 總有很多 shortcut 。
第一個是 _factory_ 方法,由 _$provide_ 提供, _module_ 的 _factory_ 是一個引用,作用一樣。這個方法直接把一個函數當成是一個對象的 _$get()_ 方法,這樣你就不用顯式地定義一個 _provider_ 了:
var app = angular.module('Demo', [], function($provide){
$provide.factory('PP', function(){
return {'hello': '123'};
});
});
app.controller('TestCtrl', function($scope, PP){ console.log(PP) });
在 _module_ 中使用:
var app = angular.module('Demo', [], function(){ });
app.factory('PP', function(){return {'abc': '123'}});
app.controller('TestCtrl', function($scope, PP){ console.log(PP) });
第二個是 _service_ 方法,也是由 _$provide_ 提供, _module_ 中有對它的同名引用。 _service_ 和 _factory_ 的區別在于,前者是要求提供一個“構造方法”,后者是要求提供 _$get()_ 方法。意思就是,前者一定是得到一個 `object` ,后者可以是一個數字或字符串。它們的關系大概是:
var app = angular.module('Demo', [], function(){ });
app.service = function(name, constructor){
app.factory(name, function(){
return (new constructor());
});
}
這里插一句,js 中 _new_ 的作用,以 `new a()` 為例,過程相當于:
1. 創建一個空對象 obj
1. 把 obj 綁定到 a 函數的上下文當中(即 a 中的 this 現在指向 obj )
1. 執行 a 函數
1. 返回 obj
_service_ 方法的使用就很簡單了:
var app = angular.module('Demo', [], function(){ });
app.service('PP', function(){
this.abc = '123';
});
app.controller('TestCtrl', function($scope, PP){ console.log(PP) });
- Introduction
- 關于AngularJS
- 關于本文檔
- 開始的例子
- 依賴注入
- 作用域
- 數據綁定與模板
- 數據->模板
- 模板->數據
- 數據->模板->數據->模板
- 模板
- 定義模板內容
- 內容渲染控制
- 節點控制
- 事件綁定
- 表單控件
- 模板中的過濾器
- 排序 orderBy
- 過濾列表 filter
- 其它
- 例子:表頭排序
- 例子:搜索
- 錨點路由
- 路由定義
- 參數定義
- 業務處理
- 定義模板變量標識標簽
- AJAX
- HTTP請求
- 廣義回調管理
- 工具函數
- 上下文綁定
- 對象處理
- 類型判定
- 其它服務
- 日志
- 緩存
- 計時器
- 表達式函數化
- 模板單獨使用
- 自定義模塊和服務
- 模塊和服務的概念與關系
- 定義模塊
- 定義服務
- 引入模塊并使用服務
- 附加模塊 ngResource
- 使用引入與整體概念
- 基本定義
- 基本使用
- 定義和使用時的占位量
- 實例
- AngularJS與其它框架的混用(jQuery, Dojo)
- 自定義過濾器
- 自定義指令directive
- 指令的使用
- 指令的執行過程
- 基本的自定義方法
- 屬性值類型的自定義
- Compile的細節
- transclude的細節
- 把節點內容作為變量處理的類型
- 指令定義時的參數
- Attributes的細節
- 預定義的 NgModelController
- 預定義的 FormController
- 示例:文本框
- 示例:模板控制語句 for
- 示例:模板控制語句 if/else