(轉)走進AngularJs(六) 服務

原文地址:http://www.cnblogs.com/lvdabao/p/3464015.html

?

  今天學習了一下ng的service機制,作為ng的基本知識之一,有必要做一個了解,在此做個筆記記錄一下。

一、認識服務(service)

  服務這個概念其實并不陌生,在其他語言中如java便有這樣的概念,其作用就是對外提供某個特定的功能,如消息服務,文件壓縮服務等,是一個獨立的模塊。ng的服務是這樣定義的:

Angular services are singletons objects or functions that carry out specific tasks common to web apps.

  它是一個單例對象或函數,對外提供特定的功能。

  • 首先是一個單例,即無論這個服務被注入到任何地方,對象始終只有一個實例。
  • 其次這與我們自己定義一個function然后在其他地方調用不同,因為服務被定義在一個模塊中,所以其使用范圍是可以被我們管理的。ng的避免全局變量污染意識非常強。

  ng提供了很多內置的服務,可以到API中查看http://docs.angularjs.org/api/。知道了概念,我們來拉一個service出來溜溜,看看到底是個什么用法。(從這篇文章開始,我就使用jsfiddle來寫示例代碼了,再也不折騰博客園的變態編輯器了~)  

  我們在controller中直接聲明$location服務,這依靠ng的依賴注入機制。$location提供地址欄相關的服務,我們在此只是簡單的獲取當前的地址。

  服務的使用是如此簡單,我們可以把服務注入到controller、指令或者是其他服務中。

二、自定義服務

  如同指令一樣,系統內置的服務以$開頭,我們也可以自己定義一個服務。定義服務的方式有如下幾種:

  • 使用系統內置的$provide服務
  • 使用Module的factory方法
  • 使用Module的service方法

  下面通過一個小例子來分別試驗一下。我們定義一個名為remoteData服務,它可以從遠程獲取數據,這也是我們在程序中經常使用的功能。不過我這里沒有遠程服務器,就寫死一點數據模擬一下。

復制代碼
//使用$provide來定義
var app = angular.module('MyApp', [], function($provide) {$provide.factory('remoteData', function() {var data = {name:'n',value:'v'};return data;});
});
復制代碼
//使用factory方法
app.factory('remoteData',function(){var data = {name:'n',value:'v'};return data;
});
//使用service方法
app.service('remoteData',function(){this.name = 'n';this.value = 'v';
});

  Module的factory和$provide的factory方法是一模一樣的,從官網文檔看它們其實就是一回事。至于Module內部是如何調用的,我此處并不打算深究,我只要知道怎么用就好了。

  再看Module的service方法,它沒有return任何東西,是因為service方法本身返回一個構造器,系統會自動使用new關鍵字來創建出一個對象。所以我們看到在構造器函數內可以使用this,這樣調用該服務的地方便可以直接通過remoteData.name來訪問數據了。

  下面我們來用一下自己定義好的服務:

三、管理服務的依賴關系

  服務與服務中間可以有依賴關系,例如我們這里定義一個名為validate的服務,它的作用是驗證數據是否合法,它需要依賴我們從遠程獲取數據的服務remoteData。代碼如下:

?  在factory的參數中,我們可以直接傳入服務remoteData,ng的依賴注入機制便幫我們做好了其他工作。不過一定要保證這個參數的名稱與服務名稱一致,ng是根據名稱來識別的。若參數的名次與服務名稱不一致,你就必須顯示的聲明一下,方式如下:

復制代碼
app.factory('validate',['remoteData',function(remoteDataService){return function(){if(remoteDataService.name=='n'){alert('驗證通過');}};
}]);
復制代碼

  我們在controller中注入服務也是同樣的道理,使用的名稱需要與服務名稱一致才可以正確注入。否則,你必須使用$inject來手動指定注入的服務。比如:

function testC(scope,rd){scope.getData = function(){alert('name:'+rd.name+'   value:'+rd.value);}
}
testC.$inject = ['$scope','remoteData'];

?

  ng服務的基本知識也就這些了。目前只是學些皮毛,或許以后用到項目中了才能體會到他的強大之處,以及在真實使用中的這樣那樣的問題。

轉載于:https://www.cnblogs.com/fcsh820/p/3464323.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377469.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux驅動程序框架以及概述

目錄驅動程序三種基本類型(組成)設備驅動程序功能驅動程序的內核模塊機制(開發模式)驅動程序框架三個主要部分1、字符設備驅動程序框架2、塊設備驅動程序框架2、網絡設備驅動程序框架驅動程序三種基本類型(組成&#x…

curl 使用整理(轉載)

我一向以為,curl只是一個編程用的函數庫。 最近才發現,這個命令本身,就是一個無比有用的網站開發工具,請看我整理的它的用法。 curl網站開發指南 阮一峰 整理 curl是一種命令行工具,作用是發出網絡請求,然…

Linux內核邏輯結構

linux內核從邏輯上可以分為5個部分: 1、進程調度 進程調度控制進程對CPU的訪問。當需要選擇下一個進程運行時,由調度程序選擇最值得運行的程序。可運行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其他資源,則該進程是不可…

對批量文件重命名

一、 文件夾下存放各種不同名稱的同類型文件 F:\test 二、重命名格式從a0開始,數字依次遞增,a0,a1,a2,a3… import ospathr"F:\test"#要修改文件的路徑 namer"a"#命名從什么開始 num0#默認從0開始,即a0,a1,a2...... …

替換Quartus 自帶編輯器 (轉COM張)

正文 此處以Quartus II 11.1和Notepad v5.9.6.2為例。 1. 使用QII自動調用Notepad來打開HDL、sdc、txt等文件;并且可以在報錯的時候,Notepad可以直接高亮所報錯的行(此模式下,Notepad最大化后效果最佳)。 方法&#xf…

scala 方法重載_Scala中的方法重載

scala 方法重載Scala方法重載 (Scala method overloading) Method overloading is a method that is redefined in different ways under the same name. Method overloading is one of the methods used to implement polymorphism in Scala. 方法重載是一種使用相同名稱以不…

C#網頁自動登錄和提交POST信息的多種方法 新人學習中

網頁自動登錄和提交POST信息的核心就是分析網頁的源代碼(HTML),在C#中,可以用來提取網頁HTML的組件比較多,常用的用WebBrowser、WebClient、HttpWebRequest這三個。 以下就分別用這三種方法來實現:1、WebBr…

四、采集和制作數據集

一、采集數據 安裝labelme:pip install labelme 打開labelme:labelme 將收集好的照片(320320,png格式)存放到一個文件夾中,例如我的是F:\test,再此文件夾下再創建個文件夾label用于存放標簽文件 使用labelme打開數據…

MTFBWU的完整形式是什么?

MTFBWU:愿力量與您同在 (MTFBWU: May The Force Be With You) MTFBWU is an abbreviation of “May The Force Be With You". MTFBWU是“愿力量與你同在”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media n…

VMware14.0 安裝 CentOS7.2

大致流程 對于VMware14.0安裝包用百度網盤下載即可。 鏈接:https://pan.baidu.com/s/1DEGa47EbI1Fup_MTXhv0xg 提取碼:izo6 華為云CentOS7 下載劃線的。其他步驟與大致流程里一樣。 最后輸入root 以及配置的密碼即可:密碼輸入時是沒有任何顯…

基于visual Studio2013解決C語言競賽題之1049抓牌排序

題目解決代碼及點評/* 功能:插入排序。許多玩牌的人是以這樣的方式來對他們手中的牌進行排序的:設手中原有3張牌已排好序,抓1張新牌,若這張新牌的次序在…

學習Lucene筆記一:創建索引

public class HelloLucene {/*** 建立索引* param args*/public void index(){IndexWriter writer null; try {//1.創建Directory,// Directory directory new RAMDirectory();//索引是建立在內存中的Directory directory FSDirectory.open(new File("D:/Lucene/ind…

【C++進階】C++創建文件/屏幕輸出流類(將信息同時輸出到文件和屏幕)

在軟件的調試技術中,很重要的一個技術是將軟件運行過程中的一些信息寫入到“日志文件”中。但是同時還要將信息顯示到屏幕上,以方便程序員實時查看這些信息。 最簡單的一種辦法是這樣的: std::ofstream output("debug.log", ios::…

五、加載數據集

之前寫過加載數據集的一些小筆記,這里詳細內容就不再敘述了 詳細學習可以參考該博文二、PyTorch加載數據 一、分析 因為U-net網絡架構是輸入1通道,大小為(572,572)的灰度圖,圖片大小無所謂,我的思路是將三通道的圖像使用OpenCV進…

CDMA的完整形式是什么?

CDMA:碼分多址 (CDMA: Code Division Multiple Access) CDMA is an abbreviation of Code Division Multiple Access. Code Division Multiple Access is a digital cellular technology and displays a network of multiple accesses. The various radio communica…

BCD碼與十進制的相互轉換

BCD碼是用每四位代替一位十進制數(0 到 9 的某一位數) 例如:0x25 就代表25 十六進制的每位轉換成二進制代表四個位。 下面是bcd轉char short int long c語言程序 //************************************************************…

DSP關于存儲器讀寫、IO讀寫時序圖的注意點

這里的存儲器圖不涉及插入等待周期。 IO設備的圖可以自行減去插入等待周期,然后觀察。 存儲器讀讀寫 存儲器寫寫讀 I/O設備讀寫操作

折騰430 launchpad

launchpad到手也已經很長時間了,團購了一個g2的,一個鐵電的,現在馬上又要來一個g2的,感覺手上的東西太多了,急需消化一下,首先呢還是先把430搞定吧。 ---------------------------------------------------…

oem模式是什么_OEM的完整形式是什么?

oem模式是什么OEM:原始設備制造商 (OEM: Original Equipment Manufacturer) OEM is an abbreviation of "Original Equipment Manufacturer". Its meaning has changed over time. In former times, it alluded to a corporation that manufactures produ…

媽了個巴卡

配置文件修改: 一、打開PC端微信,打開咩了個咩小程序,點進入第一關,之后再關掉小程序 二、PC端微信設置里面,找到管理文件,打開文件夾 三、Applet下按修改日期找到a9結尾的文件 四、接著進入\usr\gamecac…