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