Angular开发者指南(五)服务
服務
AngularJS服務是使用依賴注入(DI)連接在一起的可替代對象。 可以使用服務在整個應用程式中整理和分享程式碼。
AngularJS服務有:
延遲初始化 - AngularJS只在應用程序組件依賴它時實例化服務。
單例 - 依賴于服務的每個組件獲取對服務工廠生成的單個實例的引用。
AngularJS提供了幾個有用的服務(如$http),但對于大多數應用程序,你也想創建自己的。像其他核心的AngularJS標識符一樣,內置服務總是以$開頭(例如$http)。
使用服務
要使用AngularJS服務,請將其添加為依賴于依賴于服務的組件(控制器,服務,過濾器或指令)的依賴項。 AngularJS的依賴注入子系統負責其余的。
index.html
<div id="simple" ng-controller="MyController" ng-app="myServiceModule"><p>讓我們嘗試這個簡單的通知服務,注入到控制器</p><input ng-init="message='test'" ng-model="message" ><button ng-click="callNotify(message);">NOTIFY</button><p>(必須點擊3次才能看到提醒)</p> </div>script.js
angular. module('myServiceModule', []).controller('MyController', ['$scope', 'notify', function($scope, notify) {$scope.callNotify = function(msg) {notify(msg);};}]). factory('notify', ['$window', function(win) {var msgs = [];return function(msg) {msgs.push(msg);if (msgs.length === 3) {win.alert(msgs.join('\n'));msgs = [];}};}]);protractor.js
it('should test service', function() {expect(element(by.id('simple')).element(by.model('message')).getAttribute('value')).toEqual('test'); });需要點擊三次NOTIFY按鈕才會出現彈出框內容
創建服務
應用程序開發人員可以使用AngularJS模塊注冊服務的名稱和服務工廠函數來自由定義自己的服務。
服務工廠函數生成表示對應用程序其余部分的服務的單個對象或函數。 服務返回的對象或函數被注入到指定對服務的依賴性的任何組件(控制器,服務,過濾器或指令)中。
注冊服務
服務通過Module API注冊到模塊。 通常您使用Module factory API注冊服務:
此時不是注冊服務實例,而是一個在調用時將創建此實例的工廠函數。
依賴
服務可以有自己的依賴。 就像在控制器中聲明依賴項一樣,可以通過在服務的工廠函數簽名中指定依賴性來聲明它們。
下面的示例模塊有兩個服務,每個具有各種依賴關系:
在示例中,需要注意的是:
batchLog服務取決于內置的$interval和$log服務。
routeTemplateMonitor服務取決于內置的$route服務和$rootscope和我們的自定義batchLog服務。
兩個服務都使用數組符號來聲明它們的依賴關系。
數組中標識符的順序與工廠函數中參數名稱的順序相同。
還可以通過模塊的配置函數中的$provide服務注冊服務:
angular.module('myModule', []).config(['$provide', function($provide) {$provide.factory('serviceId', function() {var shinyNewServiceInstance;// 構造shinyNewServiceInstance的工廠函數體return shinyNewServiceInstance;}); }]);這種技術通常用于單元測試中來模擬服務的依賴。
單元測試
以下是來自上面的創建服務示例的通知服務的單元測試。 單元測試示例使用Jasmine spy(mock),而不是真正的瀏覽器alert。
總結
以上是生活随笔為你收集整理的Angular开发者指南(五)服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javese 5 中的枚举类及单例模式
- 下一篇: Eclipse下Maven新建Web项目