### 15.5. 實例
_ngResource_ 要舉一個實例是比較麻煩的事。因為它必須要一個后端來支持,這里如果我用 Python 寫一個簡單的后端,估計要讓這個后端跑起來對很多人來說都是問題。所以,我在幾套公共服務的 API 中糾結考察了一番,最后使用 [www.rememberthemilk.com](http://www.rememberthemilk.com) 的 API 來做了一個簡單的,可用的例子。
例子見: [http://zouyesheng.com/demo/ng-resource-demo.html](http://zouyesheng.com/demo/ng-resource-demo.html) (可以直接下載看源碼)
先說一下 API 的情況。這里的請求調用全是跨域的,所以交互上全部是使用了 JSONP 的形式。 API 的使用有使用簽名認證機制,嗯, js 中直接算 md5 是可行的,我用了一個現成的庫(但是好像不能處理中文吧)。
這個例子中的 `LoginCtrl` 大家就不用太關心了,參見官方的文檔,走完流程拿到 _token_ 完事。與 _ngResource_ 相關的是 `MainCtrl` 中的東西。
其實從這個例子中就可以看出,目前 _ngResource_ 的機制對于服務端返回的數據的格式是嚴重依賴的,同時也可以反映出 _$http_ 對一些場景根本無法應對的局限。所以,我現在的想法是理解 _ngResource_ 的思想,真正需要的人自己使用 _jQuery_ 重新實現一遍也許更好。這應該也花不了多少時間, _ngResource_ 的代碼本來不多。
我為什么說 _$http_ 在一些場景中有局限呢。在這個例子當中,所有的請求都需要帶一個簽名,簽名值是由請求中帶的參數根據規則使用 md5 方法計算出的值。我找不到一個 hook 可以讓我在請求出去之前修改這個請求(添加上簽名)。所以在這個例子當中,我的做法是根據 _ngResource_ 的請求最后會使用 _$httpBackend_ 這個底層服務,在 module 定義時我自己復制官方的相關代碼,重新定義 _$httpBackend_ 服務,在需要的地方做我自己的修改:
script.src = sign_url(url);
不錯,我就改了這一句,但我不得不復制了 50 行官方源碼到我的例子中。
另外一個需要說的是對返回數據的處理。因為 _ngResource_ 會使用返回的數據直接填充實例,所以這個數據格式就很重要。
首先,我們可以使用 `$http.defaults.transformResponse` 來統一處理一下返回的數據,但是這并不能解決所有問題,可目前 _ngResource_ 并不提供對每一個 _action_ 的單獨的后處理回調函數項。除非你的服務端是經過專門的適應性設計的,否則你用 _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;
});
- Introduction
- 關于AngularJS
- 關于本文檔
- 開始的例子
- 依賴注入
- 作用域
- 數據綁定與模板
- 數據->模板
- 模板->數據
- 數據->模板->數據->模板
- 模板
- 定義模板內容
- 內容渲染控制
- 節點控制
- 事件綁定
- 表單控件
- 模板中的過濾器
- 排序 orderBy
- 過濾列表 filter
- 其它
- 例子:表頭排序
- 例子:搜索
- 錨點路由
- 路由定義
- 參數定義
- 業務處理
- 定義模板變量標識標簽
- AJAX
- HTTP請求
- 廣義回調管理
- 工具函數
- 上下文綁定
- 對象處理
- 類型判定
- 其它服務
- 日志
- 緩存
- 計時器
- 表達式函數化
- 模板單獨使用
- 自定義模塊和服務
- 模塊和服務的概念與關系
- 定義模塊
- 定義服務
- 引入模塊并使用服務
- 附加模塊 ngResource
- 使用引入與整體概念
- 基本定義
- 基本使用
- 定義和使用時的占位量
- 實例
- AngularJS與其它框架的混用(jQuery, Dojo)
- 自定義過濾器
- 自定義指令directive
- 指令的使用
- 指令的執行過程
- 基本的自定義方法
- 屬性值類型的自定義
- Compile的細節
- transclude的細節
- 把節點內容作為變量處理的類型
- 指令定義時的參數
- Attributes的細節
- 預定義的 NgModelController
- 預定義的 FormController
- 示例:文本框
- 示例:模板控制語句 for
- 示例:模板控制語句 if/else