Ich möchte $ resource verwenden, um meinen RESTful-Webdienst aufzurufen (an dem ich noch arbeite), aber ich möchte zuerst herausfinden, ob mein AngularJS-Skript korrekt ist.
Das todo DTO hat: {id, order, content, done}
:cmd
ist so kann ich aufrufen api/1/todo/reset
, um die ToDo-Tabelle in der Datenbank zu löschen.
Hier ist der Code mit einem Kommentar meines Verständnisses:
function TodoService($resource) {
var src = $resource('api/1/todo/:id:cmd',
{id: "@id", cmd: "@cmd"}, //parameters default
{
ListTodos: { method: "GET", params: {} },
GetTodo: { method: "GET", params: { id: 0 } },
CreateTodo: { method: "POST", params: { content: "", order: 0, done: false } },
UpdateTodo: { method: "PATCH", params: { /*...*/ } },
DeleteTodo: { method: "DELETE", params: { id: 0 } },
ResetTodos: { method: "GET", params: { cmd: "reset" } },
});
//Usage:
//GET without ID
//it calls -> api/1/todo
src.ListTodos();
//GET with ID
//it calls -> api/1/todo/4
src.GetTodo({ id: 4 });
//POST with content, order, done
//it calls -> api/1/todo
src.CreateTodo({ content: "learn Javascript", order: 1, done: false });
//UPDATE content only
//it calls -> api/1/todo/5
src.UpdateTodo({ id: 5, content: "learn AngularJS" });
//UPDATE done only
//it calls -> api/1/todo/5
src.UpdateTodo({ id: 5, done: true });
//RESET with cmd
//it calls -> api/1/todo/reset
src.ResetTodos();
}
Ich bin mir nicht sicher, ob es sich um die PATCH-Methode handelt. Ich möchte nicht alles aktualisieren. Kann ich nur ein Feld aktualisieren? Konstruiere ich diesen Code richtig?
obj.save()
. Sie können das tun, was Sie mit einer grundlegenden $ http-Implementierung versuchen.Antworten:
$ resource sollte Daten von einem Endpunkt abrufen, bearbeiten und zurücksenden. Sie haben etwas davon drin, aber Sie nutzen es nicht wirklich für das, wofür es gemacht wurde.
Es ist in Ordnung, benutzerdefinierte Methoden für Ihre Ressource zu haben, aber Sie möchten nicht auf die coolen Funktionen verzichten, die mit OOTB geliefert werden.
EDIT : Ich glaube nicht, dass ich das ursprünglich gut genug erklärt habe, aber ich
$resource
mache ein paar funky Sachen mit Retouren.Todo.get()
undTodo.query()
beide geben das Ressourcenobjekt zurück und übergeben es an den Rückruf, wenn der Abruf abgeschlossen ist. Es macht einige ausgefallene Sachen mit Versprechungen hinter den Kulissen, die bedeuten, dass Sie anrufen können,$save()
bevor derget()
Rückruf tatsächlich ausgelöst wird, und es wird warten. Es ist wahrscheinlich am besten, nur mit Ihrer Ressource innerhalb eines Versprechensthen()
oder der Rückrufmethode umzugehen .Standardgebrauch
Ebenso könnten Sie im Fall von dem, was Sie im OP gepostet haben, ein Ressourcenobjekt abrufen und dann (theoretisch) eine Ihrer benutzerdefinierten Funktionen darauf aufrufen:
Ich würde mit der OOTB-Implementierung experimentieren, bevor ich meine eigene erfand. Und wenn Sie feststellen, dass Sie keine der Standardfunktionen von verwenden
$resource
, sollten Sie diese wahrscheinlich nur$http
alleine verwenden.Update: Angular 1.2 und Versprechen
Ab Angular 1.2 unterstützen Ressourcen Versprechen. Aber sie haben den Rest des Verhaltens nicht geändert.
Um Versprechen zu nutzen
$resource
, müssen Sie die$promise
Eigenschaft für den zurückgegebenen Wert verwenden.Beispiel mit Versprechungen
Denken Sie daran, dass die
$promise
Eigenschaft eine Eigenschaft mit denselben Werten ist, die sie oben zurückgegeben hat. So können Sie komisch werden:Diese sind gleichwertig
quelle
Todo.get({id: 123});
Versprechen und kein direktes Objekt zurück?du kannst es einfach tun
$scope.todo = Todo.get({ id: 123 })
..get()
und.query()
auf einer Ressource ein Objekt sofort zurückgeben und es später mit dem Ergebnis des Versprechens füllen (um Ihre Vorlage zu aktualisieren). Es ist kein typisches Versprechen, weshalb Sie entweder einen Rückruf oder die Eigenschaft $ versprechen verwenden müssen, wenn Sie einen speziellen Code haben, den Sie nach dem Aufruf ausführen möchten. Es ist jedoch nicht erforderlich, es in einem Rückruf Ihrem Bereich zuzuweisen, wenn Sie es nur in der Vorlage verwenden.quelle