Использование встроенного URL-адреса ресурса в AngularJS $resource

Итак, у меня есть ресурс REST в этом направлении...

/api/Dogs
/api/Dogs/1
/api/Dogs/2
...

Как выглядит собака...

{
    Id: 1,
    Url: "http://kennelclub/api/Dogs/1",
    Name: "Butch"
}

и второй ресурс вроде так...

/api/Owners
/api/Owners/1
....

Для удобства, чтобы получить собак для владельца, у меня есть этот метод запроса...

/api/Owners/1/Dogs/

Теперь тривиально легко заставить AngularJS $resource читать собак владельцев, как показано ниже...

var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" });
var ownersDogs.query({ ownerId: 1 });

Наконец, вопрос

Я хочу внести изменения в собаку, полученную по этому URL-адресу, с помощью функции magic angular $save...

ownersDogs[0].Name = "Barry";
ownersDogs[0].$save();

Однако здесь есть две проблемы...

  • этот URL-адрес вспомогательного ресурса доступен только для чтения (т.е. не принимает PUT/POST).
  • Даже если бы это было не так, мне нужно повторно поставить ownerId в функции $get/$save на объектах, чтобы они работали правильно.

Если я хочу отредактировать возвращенную собаку, мне нужно использовать URL-адрес /api/Dogs/1. Это позволяет читать/записывать и не требует идентификатора владельца. Вы заметите, что этот URL-адрес уже встроен в возвращаемый объект Dog.

Есть ли способ заставить функции $save, $get и т. д. возвращаемого объекта автоматически (?) использовать URL-адрес, встроенный в ресурс? Или, по крайней мере, есть ли способ изменить URL-адрес, который будет использовать $save?


person Mark    schedule 17.07.2015    source источник
comment
На мой взгляд, когда я становлюсь слишком сложным с точки зрения URL-адреса, я предпочитаю использовать свой URL-адрес с вызовами $http, раскрывающими их в службе, вместо использования $resource. Но это только дело вкуса. Вы действительно хотите идти в ногу с $resource ?   -  person Okazari    schedule 17.07.2015
comment
$resource, на мой взгляд, намного чище. Мне особенно нравится, как он возвращает объект, который будет использоваться немедленно, а затем заполняет объект позже без необходимости каких-либо обратных вызовов.   -  person Mark    schedule 17.07.2015
comment
Да, я определенно согласен с вами в этом. Однако Кенавоз дал довольно хороший ответ.   -  person Okazari    schedule 17.07.2015


Ответы (3)


Вы можете добавить собственные методы к своему ресурсу с помощью пользовательского URL-адреса:

var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
    {
    'savedog': { method : 'PUT', url: '/api/Dogs/:dogId'}
    }
);

Вызов с помощью:

ownersDogs[0].$savedog();
person SLePort    schedule 17.07.2015

Вы можете параметризовать $save следующим образом:

ownerDogs[0].$save(function(ownerObject, putResponseHeaders) {
    //ownerObject => saved user object
    //putResponseHeaders => $http header getter
});
person Alexandru Olaru    schedule 17.07.2015

Я не могу найти способ использовать параметр Url в возвращаемом ресурсе, но я решил проблему другим способом. Вы можете просто указать разные URL-адреса для операций сохранения и т. д. следующим образом...

var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
    {
        'save': { method: 'POST', url: '/api/Dogs/:dogId'}
    });
person Mark    schedule 17.07.2015