2014-01-22 134 views
12

如何從$資源獲得空響應?

我正在此:

angular.module("services").factory('Member', function($resource) { 
    var Member = $resource('/api/v1/member.json'); 

    Member.current = Member.get(); 

    return Member; 
}); 

但是服務器與響應:

null 

因爲用戶沒有登錄

但是當我登錄的結果我得到此:

Resource 
    0: "n" 
    1: "u" 
    2: "l" 
    3: "l" 
    $promise: Object 
    $resolved: true 
    __proto__: Resource 

從哪裏可以預計字面意思是null

+1

爲什麼這些好的未受請求問題得到這麼少的關注,這些天? Btw @stewie回答了關於點(y) – angabriel

回答

14

$resource.get方法,默認情況下,預計JSON響應是一個對象(解析時)。 當調用$resource.get()時,結果將成爲$資源的一個實例。

在你的榜樣,呼籲Member.get({id:1})會產生被與解析的JSON響應的特性呼喚new Member()source然後populated source(當XHR完成)創建的$資源實例:

shallowClearAndCopy(data, value); 

的簽名功能與您的Member例如填充如下:

function shallowClearAndCopy(src, dst) { 
    dst = dst || {}; 

    angular.forEach(dst, function(value, key){ 
    delete dst[key]; 
    }); 

    for (var key in src) { 
    if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') { 
     dst[key] = src[key]; 
    } 
    } 

    return dst; 
} 

掃視函數體中,你會發現該功能並不期望src參數只能是對象(for (var key in src) { ...)。所以,如果你爲它提供字符串"null"結果將是:

{1: "n", 2: "u", 3: "l", ...} 

ngResource是建立在支持與一個JSON API的REST類型作爲一個隱含的數據傳輸格式,因此你將無法使用響應,如"null"或其他任何不是有效JSON的內容。


除非。

除非你使用的transformResponse"null"轉換爲類似{'null': true}上飛:

app.factory('Member', function($resource) { 
    var Member = $resource('member.txt', {}, { 
    get: { 
     method: 'GET', 
     isArray: false, 
     transformResponse: function(data, headersGetter){ 
     if(data === 'null'){ 
      return {null: true}; 
     } 
     return angular.fromJson(data); 
     } 
    } 
    }); 
    return Member; 
}); 

$scope.member = Member.get({id: 1}); 
console.log($scope.member); // --> {null: true} 

DEMO

+0

像一個魅力 – Lekhnath

2

你的代碼看起來不錯。但在控制檯中看到這種輸出是-muted-的一種痛苦。一要修復它馬上,設置任何選項的結果格式,改變網址,HTTP/HTTPS //擺弄等

但事實是

調用這是不允許的URL,因爲用戶沒有登錄。

人們期望一個不錯的403所以$resource小號故障處理程序執行。

這樣,你的結果處理不執行在所有的;)

Member.current = Member.get; //note removed() here 

// then outside call: 
Member.current(
    function(result) { 
    // should not execute for 403 
    }, 
    function(fault) { 
    // TODO: handle case: 'user not logged in' 
    });