### 15.3. 基本使用
在定義了資源之后,我們看如果使用這些資源,發出請求:
var book = Book.read({id: '123'}, function(response){
console.log(response);
});
這里我們進行 _Book_ 的“類”方法調用。在方法的使用上,根據官方文檔:
HTTP GET "class" actions: Resource.action([parameters], [success], [error])
non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
non-GET instance actions: instance.$action([parameters], [success], [error])
我們這里是第二種形式,即類方法的非 GET 請求。我們給的參數會作為 `postData` 傳遞。如果我們需要 GET 參數,并且還需要一個錯誤回調,那么:
var book = Book.read({get: 'haha'}, {id: '123'},
function(response){
console.log(response);
},
function(error){
console.log(error);
}
);
調用之后,我們會立即得到的 `book` ,它是 Book 類的一個實例。這里所謂的實例,實際上就是先把所有的 _action_ 加一個 **$** 前綴放到一個空對象里,然后把發出的參數填充進去。等請求返回了,把除 _action_ 以外的成員刪除掉,再把請求返回的數據填充到這個對象當中。所以,如果我們這樣:
var book = Book.read({id: '123'}, function(response){
console.log(book);
});
console.log(book)
就能看到 `book` 實例的變化過程了。
現在我們得到一個真實的實例,看一下實例的調用過程:
//響應的數據是 {result: 0, msg: '', obj: {id: 'xxx'}}
var book = Book.create({title: '測試標題', author: '測試作者'}, function(response){
console.log(book);
});
可以看到,在請求回調之后, `book` 這個實例的成員已經被響應內容填充了。但是這里有一個問題,我們返回的數據,并不適合一個 book 實例。格式先不說,它把 `title` 和 `author` 這些信息都丟了(因為響應只返回了 `id` )。
如果僅僅是格式問題,我們可以通過配置 _$http_ 服務來解決( AJAX 請求都要使用 _$http_ 服務的):
$http.defaults.transformResponse = function(data){return angular.fromJson(data).obj};
當然,我們也可以自己來解決一下丟信息的問題:
var p = {title: '測試標題', author: '測試作者'};
var book = Book.create(p, function(response){
angular.extend(book, p);
console.log(book);
});
不過,始終會有一些不方便了。比較正統的方式應該是調節服務器端的響應,讓服務器端也具有和前端一樣的實例概念,返回的是完整的實例信息。即使這樣,你也還要考慮格式的事。
現在我們得到了一個真實的 `book` 實例了,帶有 `id` 信息。我們嘗試一下實例的方法調用,先回過去頭看一下那三種調用形式,對于實例只有第三種形式:
non-GET instance actions: instance.$action([parameters], [success], [error])
首先解決一個疑問,如果一個實例是進行一個 GET 的調用會怎么樣?沒有任何問題,這當然沒有任何問題的,形式和上面一樣。
如何實例是做 POST 請求的話,從形式上看,我們無法控制請求的 _postData_ ?是的,所有的 POST 請求,其 _postData_ 都會被實例數據自動填充,形式上我們只能控制 _params_ 。
所以,如果是在做修改調用的話:
book.$update({title: '新標題', author: '測試作者'}, function(response){
console.log(book);
});
這樣是沒有意義的并且錯誤的。因為要修改的數據只是作為 GET 參數傳遞了,而 `postData` 傳遞的數據就是當前實例的數據,并沒有任何修改。
正確的做法:
book.title = '新標題'
book.$update(function(response){
console.log(book);
});
顯然,這種情況下,回調都可以省了:
book.title = '新標題'
book.$update();
- Introduction
- 關于AngularJS
- 關于本文檔
- 開始的例子
- 依賴注入
- 作用域
- 數據綁定與模板
- 數據->模板
- 模板->數據
- 數據->模板->數據->模板
- 模板
- 定義模板內容
- 內容渲染控制
- 節點控制
- 事件綁定
- 表單控件
- 模板中的過濾器
- 排序 orderBy
- 過濾列表 filter
- 其它
- 例子:表頭排序
- 例子:搜索
- 錨點路由
- 路由定義
- 參數定義
- 業務處理
- 定義模板變量標識標簽
- AJAX
- HTTP請求
- 廣義回調管理
- 工具函數
- 上下文綁定
- 對象處理
- 類型判定
- 其它服務
- 日志
- 緩存
- 計時器
- 表達式函數化
- 模板單獨使用
- 自定義模塊和服務
- 模塊和服務的概念與關系
- 定義模塊
- 定義服務
- 引入模塊并使用服務
- 附加模塊 ngResource
- 使用引入與整體概念
- 基本定義
- 基本使用
- 定義和使用時的占位量
- 實例
- AngularJS與其它框架的混用(jQuery, Dojo)
- 自定義過濾器
- 自定義指令directive
- 指令的使用
- 指令的執行過程
- 基本的自定義方法
- 屬性值類型的自定義
- Compile的細節
- transclude的細節
- 把節點內容作為變量處理的類型
- 指令定義時的參數
- Attributes的細節
- 預定義的 NgModelController
- 預定義的 FormController
- 示例:文本框
- 示例:模板控制語句 for
- 示例:模板控制語句 if/else