Я бы хотел использовать $ 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, я не хочу обновлять все, могу ли я обновить только одно поле? Я правильно строю этот кусок кода?
obj.save()
. Вы можете сделать то, что вы пытаетесь сделать с базовой реализацией $ http.Ответы:
$ resource предназначался для извлечения данных из конечной точки, манипулирования ими и их отправки обратно. У вас есть кое -что из этого, но вы на самом деле не используете это для того, чтобы это было сделано.
Хорошо иметь собственные методы на вашем ресурсе, но вы не хотите упускать классные функции, которые есть в OOTB.
РЕДАКТИРОВАТЬ : Я не думаю, что я объяснил это достаточно хорошо первоначально, но
$resource
делает некоторые интересные вещи с возвращениями.Todo.get()
иTodo.query()
оба возвращают объект ресурса и передают его в обратный вызов для завершения get. Он делает некоторые причудливые вещи с обещаниями за кулисами, что означает, что вы можете позвонить$save()
до того, какget()
обратный вызов действительно сработает, и он будет ждать. Вероятно, лучше всего иметь дело с вашим ресурсом внутри обещанияthen()
или метода обратного вызова.Стандартное использование
Аналогично, в случае того, что вы разместили в OP, вы можете получить объект ресурса и затем вызвать любую из ваших пользовательских функций (теоретически):
Я бы поэкспериментировал с реализацией OOTB, прежде чем пойти и изобрести свою собственную. И если вы обнаружите, что не используете какие-либо функции по умолчанию
$resource
, вам, вероятно, следует использовать$http
их самостоятельно.Обновление: Angular 1.2 и Promises
Начиная с версии 1.2, ресурсы обещают поддержку. Но они не изменили остальное поведение.
Чтобы использовать обещания с
$resource
, вам нужно использовать$promise
свойство возвращаемого значения.Пример использования обещаний
Просто помните, что
$promise
свойство является свойством с теми же значениями, которые оно возвращало выше. Таким образом, вы можете получить странные:Это эквивалентно
источник
Todo.get({id: 123});
возвращает обещание, а не прямой объект?ты можешь просто сделать
$scope.todo = Todo.get({ id: 123 })
..get()
и.query()
на Ресурсе немедленно верните объект и заполните его результатом обещания позже (чтобы обновить ваш шаблон). Это не типичное обещание, поэтому вам нужно либо использовать обратный вызов, либо свойство $ обещание, если у вас есть специальный код, который вы хотите выполнить после вызова. Но нет необходимости назначать его вашей области в обратном вызове, если вы используете его только в шаблоне.источник