AngularJS Resource實例

2018-07-26 17:12 更新

ngResource 要舉一個實例是比較麻煩的事。因為它必須要一個后端來支持,這里如果我用 Python 寫一個簡單的后端,估計要讓這個后端跑起來對很多人來說都是問題。所以,我在幾套公共服務的 API 中糾結考察了一番,最后使用 www.rememberthemilk.com 的 API 來做了一個簡單的,可用的例子。

例子見: http://zouyesheng.com/demo/ng-resource-demo.html (可以直接下載看源碼)

先說一下 API 的情況。這里的請求調(diào)用全是跨域的,所以交互上全部是使用了 JSONP 的形式。 API 的使用有使用簽名認證機制,嗯, js 中直接算 md5 是可行的,我用了一個現(xiàn)成的庫(但是好像不能處理中文吧)。

這個例子中的 LoginCtrl 大家就不用太關心了,參見官方的文檔,走完流程拿到 token 完事。與 ngResource 相關的是 MainCtrl 中的東西。

其實從這個例子中就可以看出,目前 ngResource 的機制對于服務端返回的數(shù)據(jù)的格式是嚴重依賴的,同時也可以反映出 $http 對一些場景根本無法應對的局限。所以,我現(xiàn)在的想法是理解 ngResource 的思想,真正需要的人自己使用 jQuery 重新實現(xiàn)一遍也許更好。這應該也花不了多少時間, ngResource 的代碼本來不多。

我為什么說 $http 在一些場景中有局限呢。在這個例子當中,所有的請求都需要帶一個簽名,簽名值是由請求中帶的參數(shù)根據(jù)規(guī)則使用 md5 方法計算出的值。我找不到一個 hook 可以讓我在請求出去之前修改這個請求(添加上簽名)。所以在這個例子當中,我的做法是根據(jù) ngResource 的請求最后會使用 $httpBackend 這個底層服務,在 module 定義時我自己復制官方的相關代碼,重新定義 $httpBackend 服務,在需要的地方做我自己的修改:

script.src = sign_url(url);

不錯,我就改了這一句,但我不得不復制了 50 行官方源碼到我的例子中。

另外一個需要說的是對返回數(shù)據(jù)的處理。因為 ngResource 會使用返回的數(shù)據(jù)直接填充實例,所以這個數(shù)據(jù)格式就很重要。

首先,我們可以使用 $http.defaults.transformResponse 來統(tǒng)一處理一下返回的數(shù)據(jù),但是這并不能解決所有問題,可目前 ngResource 并不提供對每一個 action 的單獨的后處理回調(diào)函數(shù)項。除非你的服務端是經(jīng)過專門的適應性設計的,否則你用 ngResource 不可能爽。例子中,我為了獲取當前列表的結果,我不得不自己去封裝結果:

var list_list = List.getList(function(){
  var res = list_list[1];
  while(list_list.length > 0){list_list.pop()};
  angular.forEach(res.list, function(v){
    list_list.push(new List({list: v}));
  });
  $scope.list_list = list_list;
  $scope.show_add = true;
  return;
});


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號