W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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; });
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: