日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Angular开发者指南(五)服务

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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注冊服務:

var myModule = angular.module('myModule', []); myModule.factory('serviceId', function() {var shinyNewServiceInstance;// 構造shinyNewServiceInstance的工廠函數體return shinyNewServiceInstance; });

此時不是注冊服務實例,而是一個在調用時將創建此實例的工廠函數。
依賴
服務可以有自己的依賴。 就像在控制器中聲明依賴項一樣,可以通過在服務的工廠函數簽名中指定依賴性來聲明它們。
下面的示例模塊有兩個服務,每個具有各種依賴關系:

var batchModule = angular.module('batchModule', []);/***`batchLog'服務允許消息在內存中排隊,并且每50秒刷新到console.log */ batchModule.factory('batchLog', ['$interval', '$log', function($interval, $log) {var messageQueue = [];function log() {if (messageQueue.length) {$log.log('batchLog messages: ', messageQueue);messageQueue = [];}}// 開始定期檢查$interval(log, 50000);return function(message) {messageQueue.push(message);} }]);/***`routeTemplateMonitor`監視每個`$ route`更改,并通過`batchLog`服務記錄當前模板*/ batchModule.factory('routeTemplateMonitor', ['$route', 'batchLog', '$rootScope',function($route, batchLog, $rootScope) {return {startMonitoring: function() {$rootScope.$on('$routeChangeSuccess', function() {batchLog($route.current ? $route.current.template : null);});}};}]);

在示例中,需要注意的是:

  • 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。

var mock, notify; beforeEach(module('myServiceModule')); beforeEach(function() {mock = {alert: jasmine.createSpy()};module(function($provide) {$provide.value('$window', mock);});inject(function($injector) {notify = $injector.get('notify');}); }); it('should not alert first two notifications', function() {notify('one');notify('two');expect(mock.alert).not.toHaveBeenCalled(); }); it('should alert all after third notification', function() {notify('one');notify('two');notify('three');expect(mock.alert).toHaveBeenCalledWith("one\ntwo\nthree"); }); it('should clear messages after alert', function() {notify('one');notify('two');notify('third');notify('more');notify('two');notify('third');expect(mock.alert.calls.count()).toEqual(2); expect(mock.alert.calls.mostRecent().args).toEqual(["more\ntwo\nthird"]); });

總結

以上是生活随笔為你收集整理的Angular开发者指南(五)服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。