2013-11-15 8 views
27

Sagen wir, ein Dienst wie folgt aus:

services.factory('User', function($resource){ 
     return $resource('/rest/usersettings/:username', {}, { 
      get: {method: 'GET'}, 
      update: {method: 'POST'} 
     }); 
    }); 

So soll es wie folgt verwendet werden:

 scope.user = User.get({username: 'bob'} ); // GET 

     console.log(JSON.stringify(scope.user))  // {"$promise":{},"$resolved":false} 

Also, wenn ich GET-Anfrage senden, es geht OK, Gebäude dieses ur + params:

http://localhost:9000/rest/usersettings/bob 

Frage, warum ich habe:{"$promise":{},"$resolved":false}

Wenn meine GET-Anforderung führt zu Json-Antwort vom Server: {"username":"bob","email":"[email protected]"} dann meine ich erwarte von Daten scope.user gefüllt haben.

Sollte ich irgendwie warten Versprechen ist bereit/gelöst?

+1

Sie können die Daten ohne $ promise und $ aufgelöst erhalten, wenn Sie die Ressource ändern und einen Interceptor hinzufügen. Ich habe diesen Ansatz hier gezeigt: http://Stackoverflow.com/a/22807840/592062 – k0nG

Antwort

60

User.get({username: 'bob'} ) nicht zu Ihren aktuellen Daten sofort zurück. Es gibt etwas zurück, das deine Daten enthält, wenn der Ajax zurückkehrt. Auf diesem (der $promise) können Sie einen zusätzlichen Rückruf registrieren, um Ihre Daten zu protokollieren.

Sie können den Code ändern:

scope.user = User.get({username: 'bob'} ); // GET 
    scope.user.$promise.then(function(data) { 
     console.log(data); 
    }); 
+1

Wenn ich dem folge, dann habe ich: 'TypeError: Methode kann nicht aufgerufen werden' dann 'von undefiniert' I Ich schätze, ich sollte $ versprechen. – ses

+0

Nein, '$ Versprechen 'ist kein Service. Es sollte eine Eigenschaft von 'scope.user' sein. Bist du sicher, dass du keinen Tippfehler hast? Kann es jetzt nicht reproduzieren, aber ich sehe, dass "$ promise" in Ihrem ursprünglichen Code definiert ist ('{" $ promise ": {}," $ resolved ": false}' bei der Eingabe) –

+8

Ich nehme an, Sie haben Angular-Versionen nicht gewechselt in der Zwischenzeit. '$ resource' hat eine brechende Veränderung. Es ist 'scope.user. $ Promise.then()' für 1.2.x und 'scope.user. $ Then()' für 1.0.x. –

12

Sie erhalten Ihre Daten dort, aber nicht sofort. Lesen Sie die docs on ngResource:

It is important to realize that invoking a $resource object method immediately returns an empty reference (object or array depending on isArray). Once the data is returned from the server the existing reference is populated with the actual data. This is a useful trick since usually the resource is assigned to a model which is then rendered by the view. Having an empty object results in no rendering, once the data arrives from the server then the object is populated with the data and the view automatically re-renders itself showing the new data. This means that in most cases one never has to write a callback function for the action methods.

+0

Ich verstehe es. Ich habe gerade diesen Code aus dem Arbeitscode bekommen. Versuchen, damit in lokalem isoliertem Umfeld zu erleben. Also, dann bedeutet es, dass es, auch wenn es dort "arbeitet", vielleicht eines Tages aufhört zu arbeiten. – ses

+0

Dies wird ** niemals ** aufhören zu arbeiten, es sei denn, Sie upgraden auf einige zukünftige Angular-Version, die brechende Änderungen in Ressource-Rückgabe (sehr unwahrscheinlich) hat. – Stewie

+0

Das bedeutet, dass es nie etwas zwischenspeichert, da es immer darauf wartet, dass Daten vom Server zurückgegeben werden. Wenn ich dies in einen Ausdruck setze, wird es eine unendliche Digest-Schleife geben, da es ständig keine Daten hat ... – user3338098

3

Vorerst Ich benutze dies (es scheint, ich this Frage duplizieren)

User.get({ 
    username: 'bob' 
}, function(user) { 

    user.$update(
     function(data, headers) { 
      console.log("GOOD"); 
     }, 
     function(err, headers) { 
      console.log("BAD"); 
     } 
    ); 
}); 
2

Dies sollte funktionieren:

User.get({username: 'bob'}).$promise.then(function(data) { 
    scope.user = data.toJSON(); 
}); 

toJSON() räumt Angulars interne Eigenschaften auf ($$).

+0

Während dies eine Lösung ist, werden Code-only-Antworten als von geringer Qualität betrachtet. Bitte fügen Sie eine Erklärung hinzu. –

+0

Ich kenne die Version des akzeptierten Ergebnisses nicht, aber in Winkel 1.5 ist dies die richtige Antwort. Das $ Versprechen gehört nicht zur 'scope.user'-, sondern zur' User.get() '-Funktion der Factory. – Seichi

Verwandte Themen