2014-01-22 10 views
12

Wie bekomme ich eine Null-Antwort von einer Ressource $?

Ich laufe dies:

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

    Member.current = Member.get(); 

    return Member; 
}); 

Aber der Server antwortet mit:.

null 

Da der Benutzer nicht angemeldet ist

Aber wenn ich das Ergebnis log ich dies:

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

Wo hätte ich wörtlich null erwartet.

+1

warum diese guten ungefragt Fragen bekommen so wenig Aufmerksamkeit in diesen Tagen? Btw @stewie beantwortete die Frage zu dem Punkt (y) – angabriel

Antwort

14

$resource.get Methode, die standardmäßig erwartet, dass die JSON-Antwort ein Objekt zu sein (wenn analysiert). Beim Aufruf von $resource.get() wird das Ergebnis eine Instanz der Ressource $ sein.

In Ihrem Beispiel Member.get({id:1}) Aufruf wird eine $ Ressourceninstanz erzeugen, die durch den Aufruf new Member()source und dann populated source (wenn XHR abgeschlossen ist) erstellt wird, mit den Eigenschaften der analysierten Antwort JSON:

shallowClearAndCopy(data, value); 

Die Unterzeichnung der mit der Funktion Ihre Member Instanz besiedelt ist wie folgt:

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; 
} 

die Funktion Körper Glancing Sie werden erkennen, dass die Funktion nichtnicht erwartetParameter ist nichts anderes als Objekt (for (var key in src) { ...). Also, wenn Sie es mit einer Schnur "null" das Ergebnis liefern wird:

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

ngResource gebaut wird eine restfull API mit JSON als implizitem Datenübertragungsformat zu unterstützen, daher werden Sie nicht in der Lage sein, zu verwenden, Antworten wie "null" oder irgendetwas anderes, das kein gültiger JSON ist.


Es sei denn.

Solange Sie keinen Gebrauch von transformResponse zu konvertieren "null" zu so etwas wie {'null': true} on the fly machen:

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

arbeitete wie ein Charme – Lekhnath

2

Ihr Code sieht gut aus. Aber diese Art von Ausgabe in der Konsole zu sehen ist ein Schmerz in der -mute-. Man will es sofort beheben, alle Optionen für die Ergebnisformate, die Änderung Urls, http/https // Hantieren usw.

Aber die Sache ist

eine URL aufrufen, die nicht zulässig ist, weil der Benutzer ist nicht angemeldet.

Man erwartet eine schöne 403 so $resource s Fehlerbehandlungs ausführt.

Auf diese Weise Ihr Ergebnis Handler überhaupt nicht ausführen;)

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' 
    }); 
Verwandte Themen