Chciałbym użyć $ resource, aby wywołać moją usługę sieciową RESTful (nad którą nadal pracuję), ale chciałbym się dowiedzieć, czy mój skrypt AngularJS został najpierw poprawny.
Todo DTO ma: {id, order, content, done}
:cmd
jest tak, że mogę zadzwonić, api/1/todo/reset
aby wyczyścić tabelę zadań do wykonania w bazie danych.
Oto kod z komentarzem mojego zrozumienia:
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();
}
Jedną z rzeczy, których nie jestem pewien, jest metoda PATCH, nie chcę aktualizować wszystkiego, czy mogę zaktualizować tylko jedno pole? Czy poprawnie tworzę ten fragment kodu?
javascript
rest
angularjs
Tomek
źródło
źródło
obj.save()
. Możesz zrobić to, co próbujesz zrobić z podstawową implementacją $ http.Odpowiedzi:
$ resource miał na celu pobieranie danych z punktu końcowego, manipulowanie nimi i wysyłanie ich z powrotem. Masz tam trochę tego, ale tak naprawdę nie wykorzystujesz tego do tego, do czego został stworzony.
Dobrze jest mieć niestandardowe metody w swoim zasobie, ale nie chcesz przegapić fajnych funkcji, które oferuje OOTB.
EDYCJA : Myślę, że początkowo nie wyjaśniłem tego wystarczająco dobrze, ale robię
$resource
trochę funky ze zwrotami.Todo.get()
iTodo.query()
oba zwracają obiekt zasobu i przekazują go do wywołania zwrotnego po zakończeniu pobierania. Robi kilka wymyślnych rzeczy z obietnicami za kulisami, co oznacza, że możesz zadzwonić,$save()
zanim wezwanieget()
zwrotne faktycznie zostanie uruchomione , i będzie czekać. Prawdopodobnie najlepiej jest zająć się zasobem w ramach obietnicythen()
lub metody wywołania zwrotnego.Standardowe zastosowanie
Podobnie, w przypadku tego, co opublikowałeś w PO, możesz pobrać obiekt zasobu, a następnie wywołać na nim dowolną ze swoich funkcji niestandardowych (teoretycznie):
Eksperymentowałem z implementacją OOTB, zanim poszedłem i wymyśliłem własną. A jeśli okaże się, że nie używasz żadnej z domyślnych funkcji programu
$resource
, prawdopodobnie powinieneś używać$http
go samodzielnie.Aktualizacja: Angular 1.2 i Promises
Począwszy od Angular 1.2, zasoby obsługują obietnice. Ale nie zmienili reszty zachowania.
Aby wykorzystać obietnice
$resource
, musisz użyć$promise
właściwości zwróconej wartości.Przykład przy użyciu obietnic
Pamiętaj tylko, że
$promise
właściwość jest właściwością na tych samych wartościach, które zwracała powyżej. Więc możesz stać się dziwny:Te są równoważne
źródło
Todo.get({id: 123});
powrócić obietnicę, a nie prosto w górę obiekt?możesz po prostu zrobić
$scope.todo = Todo.get({ id: 123 })
..get()
a.query()
na zasobie natychmiast zwróć obiekt i wypełnij go później wynikiem obietnicy (aby zaktualizować szablon). To nie typowy obietnica, dlatego trzeba użyć wywołania zwrotnego lub właściwość $ obietnica, jeśli masz jakiś specjalny kod, który chcesz wykonywany po wywołaniu. Ale nie ma potrzeby, aby przypisać go do swojego zakresu w zwrotnego jeśli tylko używając go w szablonie.źródło