通過AngularJS實現前端與背景資料對接(二)——服務(service,$http)篇

來源:互聯網
上載者:User

標籤:

什麼是服務?

      服務提供了一種能在應用的整個生命週期內保持資料的方法,它能夠在控制器之間進行通訊,並且能保證資料的一致性。 服務是一個單例對象,在每個應用中只會被執行個體化一次(被$injector執行個體化),並且是消極式載入的(需要時才會被建立)。服務提供了把與特定功能相關聯的方法集中在一起的介面。(此解釋來源於AngularJS權威教程)。

       在筆者的認知中,服務就是用來建立資料,儲存資料,也可以向後台請求資料的一個很特別的“領域”,除此之外,服務還能與控制器之間進行緊密的通訊,保證資料能通過控制器顯示在頁面上。

 

基礎知識(源於AngularJS權威教程)

1、service():

    使用service()可以註冊一個支援建構函式的服務,它允許我們為服務物件註冊一個建構函式。

  service()方法接受兩個參數:

    ? name(字串) 要註冊的服務名稱。

    ? constructor(函數) 建構函式,我們調用它來執行個體化服務物件。

2、$http():

  使用$http()服務可以將應用同來自遠程伺服器的資訊整合在一起。

  $http服務是只能接受一個參數的函數,這個參數是一個對象,包含了用來產生HTTP請求的配置內容。這個函數返回一個promise對象,具有success和error兩個方法。

 

介紹通過AngularJS實現前端與背景資料對接——服務(service、$http)篇

1、初始設定變數

目的:便於把背景資料儲存到這些已經初始化好的變數中。除此之外,這些初始設定變數也是服務service與控制器controller保持緊密通訊的 媒介(用來傳遞資料)

例:

       

 

ps:

a、由於this會經常使用,因此必須先把this用一個變數儲存起來,避免在function裡使用this的時候,出現bug

  (因為在function裡this指代的是window對象,而不是我們想要的指代的對象)

b、對於變數來說,一般用var定義就好(但是,用var 定義的變數一般只在其範圍內可被使用)

c、對於function來說,一般用this,因為用了this之後,這些function可以被控制器controller調用

2、請求資料

**三大步驟**

$http({        method: ‘GET‘,        url: ‘/api/users.json‘    }).success(function(data,status,headers,config) {        // 當相應準備就緒時調用    }).error(function(data,status,headers,config) {        // 當響應以錯誤狀態返回時調用    });

ps:

  a、$http()的用途:向後台發送請求,請求前端所需要的資料

  b、success()的用途:在響應返回時,如果是請求成功,那麼就會有相應的操作

  c、error的用途:在響應返回時,如果是請求成功,那麼就會有相應的操作

 

 **筆者做的項目中的一個小例子**

 1  this.getInviteData=function (pageNum,pageSize,sort,edition) { 2         $http({ 3             method:‘POST‘, 4             url:‘member_list.action‘, 5             data:JSON.stringify({ 6                 ‘pageNum‘: pageNum, 7                 ‘pageSize‘: pageSize, 8                 ‘sort‘: sort, 9                 ‘edition‘: edition10             })11         }).success(function (data,status,header,config) {12             if(data.status == ‘true‘&& data.recordList){13                 //每次請求,清空原數組內的資料,不然會出現資料累加,從而出現Bug14                 inviteData.data=[];15                 //遍曆資料庫裡的recordList裡的資料,record指的就是當前遍曆的資料16                 angular.forEach(data.recordList,function (record) {17                     //把record裡的資料存放區到 inviteData.data這個已經設定好的空數組裡18                     inviteData.data.push({19                         name:record.name,20                         department:record.department,21                         position:record.position,22                         phoneNumber:record.phoneNumber,23                         state:record.state24                     });25                 });26                 //總人數,將url請求的資料裡的recordCount賦值給inviteData.total27                 inviteData.total=data.recordCount;28                 inviteData.hasJoinedPeople=data.joinCount;29                 //向子級$scope傳遞資料30                 $rootScope.$broadcast(‘getInviteDataA‘,inviteData);31             }else if(data.status==‘false‘){32                 console.info(‘由於網路問題,暫時無法擷取資料‘);33             }34         }).error(function (data,status,header,config) {35             console.error(‘伺服器繁忙,請稍後再試!‘);36         });37     };

 ps:

a、並不是所有$http()裡都需要data這個鍵的,這是要視情況而言的。

    data:data代表的是這個$http()對象中包含了將會被當作訊息體發送給伺服器的資料。通常在發送POST請求時使用。

  根據這次項目,筆者認為:如果 不需要 通過 傳參 向伺服器擷取資料的時候,就不需要data這個鍵;如果 需要 通過傳參向伺服器擷取資料,就需要data這個鍵。

在這裡,筆者為讀者為介紹兩種 資料格式轉化的方法

   1、JSON.parse()用於從一個字串中解析出json對象。

 var str = ‘{"name":"huangxiaojian","age":"23"}‘; JSON.parse(str);//age: "23"   name: "huangxiaojian"
2、JSON.stringify()用於從一個對象解析出字串。
var a = {a:1,b:2};JSON.stringify(a);// "{"a":1,"b":2}"

 

b、一開始做這個項目的時候,筆者覺得很奇怪,為什麼success()裡一開始就要有這個if(data.status == ‘true‘&& data.recordList){} else if(){}判斷?

    目的:當請求成功後,方便前端工作者在與後台進行資料對接時,判斷是否成功把資料對接到controller裡。當然,這也需要在頁面進行資料顯示的設定。這“是否成功”的結

      果將可以在頁面的控制台顯示出來。這些判斷有利於前端工作者在與後台進行資料對接時找bug

 

c、每次請求成功時,都必須清空原數組內的資料。

    筆者在項目中做了一個總人數的統計,在沒有清空儲存總人數這個資料的數組時,出現了一個Bug:所得的總人數不是想要的,而是資料不斷的累加。同時,清空數組,也是為了避免上一次請求的資料影響經過新請求後所需要的資料。

 

d、資料擷取angular.forEach()。

  由於頁面是需要顯示資料庫裡的部分資料,那麼從後台擷取資料,就需要通過 angular.forEach() 把後台已經寫好的資料遍曆一遍,取出自己想要的資料,並放在已經初始

  化好的數組裡,方便與controller串連。

 

e、資料傳遞——$rootScope.$broadcast()

  每次請求成功,都需要把在service裡的資料通過 $rootScope.$broadcast() 廣播給其在controller裡的 子級$scope(子級通過$scope.$on()接收父級傳來的資料)。

 筆者在這裡為讀者介紹一下事件的傳播:

 1、$emit()【子傳父】:

   使用$emit()來冒泡事件——把事件沿著範圍鏈向上派送(從子範圍到父範圍)

  $emit()方法帶有兩個參數:

     1. name(字串):要發出的事件名稱。

     2. args(集合):一個參數的集合,作為對象傳遞到事件監聽器中。

 2、$broadcast()【父傳子】

  使用用$broadcast()向下傳遞事件——把事件向下傳遞(從父範圍到子範圍)

  $emit()方法帶有兩個參數:

     1. name(字串):要發出的事件名稱。

     2. args(集合):一個參數的集合,作為對象傳遞到事件監聽器中。

 3、$on()【接收$broadcast()傳遞的資料】:

  $on()方法有兩個參數:

     1、name(字串):監聽事件的名稱

     2、function(event,data){}:data指的是傳遞來的資料  event指的是傳遞來的事件

通過AngularJS實現前端與背景資料對接(二)——服務(service,$http)篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.