W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在定義了資源之后,我們看如果使用這些資源,發(fā)出請(qǐng)求:
var book = Book.read({id: '123'}, function(response){ console.log(response); });
這里我們進(jìn)行 Book 的“類”方法調(diào)用。在方法的使用上,根據(jù)官方文檔:
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 請(qǐng)求。我們給的參數(shù)會(huì)作為 postData 傳遞。如果我們需要 GET 參數(shù),并且還需要一個(gè)錯(cuò)誤回調(diào),那么:
var book = Book.read({get: 'haha'}, {id: '123'}, function(response){ console.log(response); }, function(error){ console.log(error); } );
調(diào)用之后,我們會(huì)立即得到的 book ,它是 Book 類的一個(gè)實(shí)例。這里所謂的實(shí)例,實(shí)際上就是先把所有的 action 加一個(gè) $ 前綴放到一個(gè)空對(duì)象里,然后把發(fā)出的參數(shù)填充進(jìn)去。等請(qǐng)求返回了,把除 action 以外的成員刪除掉,再把請(qǐng)求返回的數(shù)據(jù)填充到這個(gè)對(duì)象當(dāng)中。所以,如果我們這樣:
var book = Book.read({id: '123'}, function(response){ console.log(book); }); console.log(book)
就能看到 book 實(shí)例的變化過程了。
現(xiàn)在我們得到一個(gè)真實(shí)的實(shí)例,看一下實(shí)例的調(diào)用過程:
//響應(yīng)的數(shù)據(jù)是 {result: 0, msg: '', obj: {id: 'xxx'}} var book = Book.create({title: '測試標(biāo)題', author: '測試作者'}, function(response){ console.log(book); });
可以看到,在請(qǐng)求回調(diào)之后, book 這個(gè)實(shí)例的成員已經(jīng)被響應(yīng)內(nèi)容填充了。但是這里有一個(gè)問題,我們返回的數(shù)據(jù),并不適合一個(gè) book 實(shí)例。格式先不說,它把 title 和 author 這些信息都丟了(因?yàn)轫憫?yīng)只返回了 id )。
如果僅僅是格式問題,我們可以通過配置 $http 服務(wù)來解決( AJAX 請(qǐng)求都要使用 $http 服務(wù)的):
$http.defaults.transformResponse = function(data){return angular.fromJson(data).obj};
當(dāng)然,我們也可以自己來解決一下丟信息的問題:
var p = {title: '測試標(biāo)題', author: '測試作者'}; var book = Book.create(p, function(response){ angular.extend(book, p); console.log(book); });
不過,始終會(huì)有一些不方便了。比較正統(tǒng)的方式應(yīng)該是調(diào)節(jié)服務(wù)器端的響應(yīng),讓服務(wù)器端也具有和前端一樣的實(shí)例概念,返回的是完整的實(shí)例信息。即使這樣,你也還要考慮格式的事。
現(xiàn)在我們得到了一個(gè)真實(shí)的 book 實(shí)例了,帶有 id 信息。我們嘗試一下實(shí)例的方法調(diào)用,先回過去頭看一下那三種調(diào)用形式,對(duì)于實(shí)例只有第三種形式:
non-GET instance actions: instance.$action([parameters], [success], [error])
首先解決一個(gè)疑問,如果一個(gè)實(shí)例是進(jìn)行一個(gè) GET 的調(diào)用會(huì)怎么樣?沒有任何問題,這當(dāng)然沒有任何問題的,形式和上面一樣。
如何實(shí)例是做 POST 請(qǐng)求的話,從形式上看,我們無法控制請(qǐng)求的 postData ?是的,所有的 POST 請(qǐng)求,其 postData 都會(huì)被實(shí)例數(shù)據(jù)自動(dòng)填充,形式上我們只能控制 params 。
所以,如果是在做修改調(diào)用的話:
book.$update({title: '新標(biāo)題', author: '測試作者'}, function(response){ console.log(book); });
這樣是沒有意義的并且錯(cuò)誤的。因?yàn)橐薷牡臄?shù)據(jù)只是作為 GET 參數(shù)傳遞了,而 postData 傳遞的數(shù)據(jù)就是當(dāng)前實(shí)例的數(shù)據(jù),并沒有任何修改。
正確的做法:
book.title = '新標(biāo)題' book.$update(function(response){ console.log(book); });
顯然,這種情況下,回調(diào)都可以省了:
book.title = '新標(biāo)題' book.$update();
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: