AngularJS $ ресурс RESTful пример
Я бы хотел использовать $resource для вызова моего веб-сервиса RESTful (над которым я до сих пор работаю), но я хотел бы узнать, правильно ли я сначала сделал мой скрипт AngularJS.
Тодо DTO имеет: {id, order, content, done}
:cmd
так я могу позвонить api/1/todo/reset
очистить таблицу задач в базе данных.
Вот код с комментарием моего понимания:
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();
}
Одна конкретная вещь, в которой я не уверен, это метод PATCH, я не хочу обновлять все, могу ли я обновить только одно поле? Я правильно строю этот кусок кода?
2 ответа
$resource предназначался для извлечения данных из конечной точки, манипулирования ими и их отправки обратно. У вас есть кое -что из этого, но вы на самом деле не используете это для того, что было сделано.
Хорошо иметь пользовательские методы на вашем ресурсе, но вы не хотите упускать из виду классные функции, которые есть в OOTB.
РЕДАКТИРОВАТЬ: Я не думаю, что я объяснил это достаточно хорошо первоначально, но $resource
делает некоторые вещи с возвращениями. Todo.get()
а также Todo.query()
оба возвращают объект ресурса и передают его в обратный вызов для завершения get. Это делает некоторые причудливые вещи с обещаниями за кулисами, что означает, что вы можете позвонить $save()
перед get()
обратный вызов на самом деле срабатывает, и он будет ждать. Вероятно, лучше всего иметь дело с вашим ресурсом внутри обещания then()
или метод обратного вызова.
Стандартное использование
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});
Аналогично, в случае того, что вы разместили в OP, вы можете получить объект ресурса и затем вызвать любую из ваших пользовательских функций (теоретически):
var something = src.GetTodo({id: 123});
something.foo = 'hi there';
something.UpdateTodo();
Я бы поэкспериментировал с реализацией OOTB, прежде чем пойти и изобрести свою собственную. И если вы обнаружите, что вы не используете какие-либо функции по умолчанию $resource
, вы должны, вероятно, просто использовать $http
по своему усмотрению.
Обновление: Angular 1.2 и Promises
Начиная с версии 1.2, ресурсы обещают поддержку. Но они не изменили остальное поведение.
Чтобы использовать обещания с $resource
, вам нужно использовать $promise
свойство на возвращаемое значение.
Пример использования обещаний
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
});
Просто имейте в виду, что $promise
Свойство - это свойство с теми же значениями, которые оно возвращало выше. Таким образом, вы можете получить странные:
Это эквивалентно
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;
});
Ты можешь просто сделать $scope.todo = Todo.get({ id: 123 })
, .get()
а также .query()
на Ресурсе немедленно верните объект и заполните его результатом обещания позже (чтобы обновить ваш шаблон). Это не типичное обещание, поэтому вам нужно либо использовать обратный вызов, либо свойство $ обещание, если у вас есть специальный код, который вы хотите выполнить после вызова. Но нет необходимости назначать его вашей области в обратном вызове, если вы используете его только в шаблоне.