AngularJS $resource RESTful przykład

Chciałbym użyć $resource do wywołania mojego serwisu internetowego RESTful (nad którym wciąż pracuję), ale chciałbym się dowiedzieć, czy mój skrypt AngularJS jest poprawny.

Todo DTO ma: {id, order, content, done}

:cmd jest więc mogę wywołać api/1/todo/reset, aby wyczyścić tabelę todo 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();
}

Jedna konkretna rzecz, której nie jestem pewien, to metoda patcha, nie chcę aktualizować wszystkiego, Czy mogę zaktualizować tylko jedno pole? Czy Ja poprawnie skonstruować ten fragment kodu?

Author: Tom, 2012-11-07

2 answers

$zasób miał na celu pobieranie danych z punktu końcowego, manipulowanie nimi i wysyłanie ich z powrotem. Masz tam trochę tego, ale nie wykorzystujesz go do tego, do czego został stworzony.

W porządku jest mieć niestandardowe metody na swoim zasobie, ale nie chcesz przegapić fajnych funkcji, które zawiera OOTB.

EDIT : nie wydaje mi się, żebym tłumaczył to wystarczająco dobrze, ale $resource robi jakieś dziwne rzeczy ze zwrotami. Todo.get() i Todo.query() zarówno zwraca obiekt resource, iprzekazuje go do wywołania zwrotnego po zakończeniu get. Robi kilka fantazyjnych rzeczy z obietnicami za kulisami, które oznaczają, że możesz zadzwonić $save(), zanim wywołanie zwrotne get() faktycznie zostanie wywołane i będzie czekać. Prawdopodobnie najlepiej jest po prostu poradzić sobie z zasobem wewnątrz obietnicy then() lub metody oddzwaniania.

Zastosowanie standardowe

var Todo = $resource('/api/1/todo/:id');

//create a todo
var todo1 = new Todo();
todo1.foo = 'bar';
todo1.something = 123;
todo1.$save();

//get and update a todo
var todo2 = Todo.get({id: 123});
todo2.foo += '!';
todo2.$save();

//which is basically the same as...
Todo.get({id: 123}, function(todo) {
   todo.foo += '!';
   todo.$save();
});

//get a list of todos
Todo.query(function(todos) {
  //do something with todos
  angular.forEach(todos, function(todo) {
     todo.foo += ' something';
     todo.$save();
  });
});

//delete a todo
Todo.$delete({id: 123});

Podobnie, w przypadku tego, co napisałeś w OP, możesz uzyskać obiekt resource a następnie wywołaj na nim dowolne niestandardowe funkcje (teoretycznie):

var something = src.GetTodo({id: 123});
something.foo = 'hi there';
something.UpdateTodo();
[15]}eksperymentowałbym z implementacją OOTB, zanim jednak wynalazłem własną. A jeśli okaże się, że nie używasz żadnej z domyślnych funkcji $resource, prawdopodobnie powinieneś używać $http samodzielnie.

Aktualizacja: Angular 1.2 i obietnice

[[15]}począwszy od Angular 1.2, obietnice wsparcia zasobów. Ale nie zmienili reszty zachowania.

Aby wykorzystać obietnice z $resource, musisz użyć właściwości $promise na zwracanej wartości.

Przykład użycia obietnic

var Todo = $resource('/api/1/todo/:id');

Todo.get({id: 123}).$promise.then(function(todo) {
   // success
   $scope.todos = todos;
}, function(errResponse) {
   // fail
});

Todo.query().$promise.then(function(todos) {
   // success
   $scope.todos = todos;
}, function(errResponse) {
   // fail
});

Należy pamiętać, że właściwość $promise jest właściwością o tych samych wartościach, które zwracano powyżej. Więc możesz być dziwny:

Są równoważne

var todo = Todo.get({id: 123}, function() {
   $scope.todo = todo;
});

Todo.get({id: 123}, function(todo) {
   $scope.todo = todo;
});

Todo.get({id: 123}).$promise.then(function(todo) {
   $scope.todo = todo;
});

var todo = Todo.get({id: 123});
todo.$promise.then(function() {
   $scope.todo = todo;
});
 208
Author: Ben Lesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 10:12:48

Możesz po prostu zrobić $scope.todo = Todo.get({ id: 123 }). .get() i .query() na zasobie zwracają obiekt natychmiast i wypełniają go wynikiem obietnicy później(aby zaktualizować szablon). Jest to nie typowa obietnica, dlatego musisz użyć funkcji callback lub właściwości $promise, jeśli masz specjalny kod, który chcesz wykonać po wywołaniu. Ale nie ma potrzeby przypisywania go do swojego zakresu w wywołaniu zwrotnym, jeśli używasz go tylko w szablonie.

 0
Author: William B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 21:34:58