Spec-Zone.ru › Angular.js 1.6

Улучшить эту документацию Посмотреть исходный код $resource

  1. $resourceProvider
  2. сервис в модуле ngResource

Обзор

Фабрика, которая создаёт объект ресурса, позволяющий взаимодействовать с RESTful источниками данных на стороне сервера.

Возвращаемый объект ресурса имеет методы действий, которые обеспечивают высокоуровневое поведение без необходимости взаимодействия с низкоуровневым сервисом $http.

Требуется модуль ngResource для установки.

По умолчанию, конечные слэши будут удалены из рассчитанных URL-адресов, что может вызвать проблемы с серверными бэкендами, которые не ожидают такого поведения. Это можно отключить, настроив $resourceProvider следующим образом:

app.config(['$resourceProvider', function($resourceProvider) {
  // Don't strip trailing slashes from calculated URLs
  $resourceProvider.defaults.stripTrailingSlashes = false;
}]);

Зависимости

  • $http
  • $log
  • $q
  • $timeout

Использование

$resource(url, [paramDefaults], [actions], options);

Аргументы

Параметр Тип Подробности
url string

Шаблон параметризованного URL-адреса с параметрами, префикс которых : как в /user/:username. Если вы используете URL-адрес с номером порта (например, http://example.com:8080/api), он будет учтён.

Если вы используете URL-адрес с суффиксом, просто добавьте суффикс, например: $resource('http://example.com/resource.json') или $resource('http://example.com/:id.json') или даже $resource('http://example.com/resource/:resource_id.:format') Если параметр перед суффиксом пуст, :resource_id в этом случае, тогда /. будет сведен к одному .. Если вам нужно, чтобы эта последовательность отображалась и не сводилась, вы можете экранировать её с помощью /\..

paramDefaults
(необязательно)
Object

Значения по умолчанию для параметров url. Эти значения можно переопределить в методах actions. Если значение параметра является функцией, оно будет вызываться каждый раз, когда требуется получить значение параметра для запроса (если параметр не был переопределён). Функция получит текущее значение данных в качестве аргумента.

Каждое ключевое значение в объекте параметра сначала привязывается к шаблону URL, если он присутствует, а затем любые лишние ключи добавляются к поисковой строке URL после ?.

Учитывая шаблон /path/:verb и параметр {verb:'greet', salutation:'Hello'} результаты в URL /path/greet?salutation=Hello.

Если значение параметра имеет префикс @, значение для этого параметра будет извлечено из соответствующего свойства в объекте data (передаваемом при вызове действий с телом запроса). Например, если объект defaultParam равен {someParam: '@someProp'}, то значение someParam будет равно data.someProp. Обратите внимание, что параметр будет пропущен при вызове метода действия "GET" (то есть метода действия, не принимающего тело запроса).

actions
(необязательно)
Object.<Object>=

Хеш с объявлением настраиваемых действий, которые будут доступны помимо стандартного набора действий ресурса (см. ниже). Если настраиваемое действие имеет тот же ключ, что и стандартное действие (например, save), стандартное действие будет перезаписано, а не расширено.

Объявление должно быть создано в формате $http.config:

{action1: {method:?, params:?, isArray:?, headers:?, ...},
 action2: {method:?, params:?, isArray:?, headers:?, ...},
 ...}

Где:

  • action – {строка} – Название действия. Это имя станет именем метода в вашем объекте ресурса.
  • method – {строка} – Регистронезависимый HTTP-метод (например, GET, POST, PUT, DELETE, JSONP, и т. д.).
  • params – {Объект=} – Необязательный набор предварительно связанных параметров для этого действия. Если любое значение параметра является функцией, оно будет вызываться каждый раз, когда требуется получить значение параметра для запроса (если параметр не был переопределён). Функция получит текущее значение данных в качестве аргумента.
  • url – {строка} – действие-специфическое url переопределение. Шаблонизация URL поддерживается так же, как и для URL-адресов ресурса.
  • isArray – {логическое значение=} – Если true, то возвращаемый объект для этого действия является массивом, см. раздел returns.
  • transformRequest – {function(data, headersGetter)|Array.<function(data, headersGetter)>} – функция преобразования или массив таких функций. Функция преобразования принимает тело и заголовки запроса HTTP и возвращает его преобразованную (как правило, сериализованную) версию. По умолчанию transformRequest будет содержать одну функцию, которая проверяет, является ли данные запроса объектом, и сериализует их с помощью angular.toJson. Чтобы предотвратить это поведение, установите transformRequest в пустой массив: transformRequest: []
  • transformResponse – {function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>} – функция преобразования или массив таких функций. Функция преобразования принимает тело, заголовки и код состояния ответа HTTP и возвращает его преобразованную (как правило, десериализованную) версию. По умолчанию transformResponse будет содержать одну функцию, которая проверяет, выглядит ли ответ как строка JSON, и десериализует её с помощью angular.fromJson. Чтобы предотвратить это поведение, установите transformResponse в пустой массив: transformResponse: []
  • cache – {boolean|Cache} – Если true, будет использоваться стандартный кэш $http для кеширования запросов GET, в противном случае, если предоставлен экземпляр кэша, созданный с помощью $cacheFactory, этот кэш будет использован для кеширования.
  • timeout – {number} – таймаут в миллисекундах.
    Примечание: В отличие от $http.config, обещания не поддерживаются в $resource, потому что одно и то же значение будет использоваться для нескольких запросов. Если вам нужна возможность отмены запросов, используйте опцию cancellable.
  • cancellable – {boolean} – если установлено в true, запрос, сделанный вызовом «не-экземпляра», будет отменён (если он ещё не завершён) вызовом $cancelRequest() на возвращаемом значении вызова. Вызов $cancelRequest() для неотменяемого или уже завершённого/отменённого запроса не окажет никакого влияния.
  • withCredentials - {boolean} - нужно ли устанавливать флаг withCredentials в объекте XHR. Для получения дополнительной информации см. запросы с учётными данными.
  • responseType - {string} - см. requestType.
  • interceptor - {Object=} - Объект-перехватчик имеет два необязательных метода - response и responseError. Оба перехватчика response и responseError вызываются с объектом http response. См. $http перехватчики. Кроме того, экземпляр ресурса или массив объектов доступны через свойство resource объекта http response. Имейте в виду, что связанное обещание будет выполнено со значением, возвращённым перехватчиком ответа, если он указан. Перехватчик ответа по умолчанию возвращает response.resource (то есть экземпляр ресурса или массив).
  • hasBody - {boolean} - позволяет указать, нужно ли включать тело запроса или нет. Если не указано, то только запросы POST, PUT и PATCH будут иметь тело.
options Object

Хеш с настраиваемыми параметрами, которые должны расширять стандартное поведение $resourceProvider. Поддерживаемые параметры:

  • stripTrailingSlashes – {логическое значение} – Если true, из рассчитанного URL-адреса будут удаляться конечные слэши. (По умолчанию true.)
  • cancellable – {логическое значение} – Если true, запрос, сделанный вызовом «не-экземпляра», будет отменён (если он ещё не завершён) вызовом $cancelRequest() на возвращаемом значении вызова. Это можно переопределить для каждого действия. (По умолчанию false.)

Возвращаемое значение

Object

Объект ресурса "класса" с методами для набора стандартных действий с ресурсом, которые можно дополнить настраиваемыми actions. Стандартный набор включает следующие действия:

{ 'get':    {method:'GET'},
  'save':   {method:'POST'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} };

Вызов этих методов вызывает $http с указанным методом HTTP, адресом и параметрами. Когда данные возвращаются с сервера, объект становится экземпляром класса ресурса. Действия save, remove и delete доступны как методы с префиксом $. Это позволяет легко выполнять операции CRUD (создание, чтение, обновление, удаление) с данными на стороне сервера, например так:

var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
  user.abc = true;
  user.$save();
});

Важно понимать, что вызов метода объекта $resource немедленно возвращает пустую ссылку (объект или массив в зависимости от isArray). Как только данные возвращаются с сервера, существующая ссылка заполняется фактическими данными. Это полезный трюк, так как обычно ресурс присваивается модели, которая затем отображается представлением. Пустой объект не отображается, как только данные приходят с сервера, объект заполняется данными, и представление автоматически перерисовывается, показывая новые данные. Это означает, что в большинстве случаев не нужно писать функцию обратного вызова для методов действия.

Методы действий для объекта класса или экземпляра могут вызываться со следующими параметрами:

  • "Действия класса" без тела: Resource.action([parameters], [success], [error])
  • "Действия класса" с телом: Resource.action([parameters], postData, [success], [error])
  • Действия экземпляра: instance.$action([parameters], [success], [error])

При вызове методов экземпляра сам экземпляр используется в качестве тела запроса (если действие должно иметь тело). По умолчанию тела запроса имеют только действия, использующие POST, PUT или PATCH, но вы можете использовать опцию конфигурации hasBody, чтобы указать, должно ли действие иметь тело или нет (независимо от метода HTTP).

Функция обратного вызова при успехе вызывается с аргументами (значение (Объект/Массив), заголовки ответа (Функция), код состояния (число), текст состояния (строка)), где значение — это заполненный экземпляр или коллекция ресурса. Функция обратного вызова при ошибке вызывается с аргументом (ответ HTTP).

Действия класса возвращают пустой экземпляр (с дополнительными свойствами ниже). Действия экземпляра возвращают обещание действия.

Экземпляры и коллекции ресурсов имеют следующие дополнительные свойства:

  • $promise: обещание исходного взаимодействия с сервером, которое создало этот экземпляр или коллекцию.

    При успехе обещание разрешается с тем же экземпляром или коллекцией ресурсов, обновлённым данными с сервера. Это облегчает использование в разделе разрешения $routeProvider.when() для отсрочки отрисовки представления до загрузки ресурсов.

    При ошибке обещание отклоняется с объектом ответа HTTP.

    Если был предоставлен объект перехватчика, обещание вместо этого будет разрешено со значением, возвращаемым перехватчиком.

  • $resolved: true после завершения первого взаимодействия с сервером (будь то успех или отказ), false до этого. Знание того, был ли ресурс разрешён, полезно при привязке данных.

    Экземпляры и коллекции ресурсов имеют следующие дополнительные методы:

  • $cancelRequest: Если есть отменяемый, ожидающий запрос, связанный с экземпляром или коллекцией, вызов этого метода прервёт запрос.

    Экземпляры ресурсов имеют следующие дополнительные методы:

  • toJSON: Возвращает простой объект без каких-либо дополнительных свойств, добавленных в рамках API ресурса. Этот объект можно сериализовать через angular.toJson безопасно без добавления свойств, специфичных для AngularJS. Обратите внимание, что JSON.stringify (и angular.toJson) автоматически используют этот метод при сериализации экземпляра ресурса (см. MDN).

Примеры

Ресурс карты кредита

// Define CreditCard class
var CreditCard = $resource('/user/:userId/card/:cardId',
 {userId:123, cardId:'@id'}, {
  charge: {method:'POST', params:{charge:true}}
 });

// We can retrieve a collection from the server
var cards = CreditCard.query(function() {
  // GET: /user/123/card
  // server returns: [ {id:456, number:'1234', name:'Smith'} ];

  var card = cards[0];
  // each item is an instance of CreditCard
  expect(card instanceof CreditCard).toEqual(true);
  card.name = "J. Smith";
  // non GET methods are mapped onto the instances
  card.$save();
  // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
  // server returns: {id:456, number:'1234', name: 'J. Smith'};

  // our custom method is mapped as well.
  card.$charge({amount:9.99});
  // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
});

// we can create an instance as well
var newCard = new CreditCard({number:'0123'});
newCard.name = "Mike Smith";
newCard.$save();
// POST: /user/123/card {number:'0123', name:'Mike Smith'}
// server returns: {id:789, number:'0123', name: 'Mike Smith'};
expect(newCard.id).toEqual(789);

Объект, возвращаемый по результатам выполнения этой функции, — это ресурс "класса", который имеет "статический" метод для каждого действия в определении.

Вызов этих методов вызывает $http на шаблоне url с заданными method, params и headers.

Ресурс пользователя

Когда данные возвращаются с сервера, объект становится экземпляром типа ресурса, и все методы, отличные от GET, доступны с префиксом $. Это позволяет легко поддерживать операции CRUD (создание, чтение, обновление, удаление) с данными на стороне сервера.

var User = $resource('/user/:userId', {userId:'@id'});
User.get({userId:123}, function(user) {
  user.abc = true;
  user.$save();
});

Стоит отметить, что функция обратного вызова при успехе для get, query и других методов получает ответ с сервера, а также функцию получения заголовков $http, поэтому можно переписать вышеприведенный пример и получить доступ к заголовкам HTTP следующим образом:

var User = $resource('/user/:userId', {userId:'@id'});
User.get({userId:123}, function(user, getResponseHeaders){
  user.abc = true;
  user.$save(function(user, putResponseHeaders) {
    //user => saved user object
    //putResponseHeaders => $http header getter
  });
});

Также можно получить доступ к исходному обещанию $http через свойство $promise возвращаемого объекта

var User = $resource('/user/:userId', {userId:'@id'});
User.get({userId:123})
    .$promise.then(function(user) {
      $scope.user = user;
    });

Создание пользовательского запроса 'PUT'

В этом примере мы создаём пользовательский метод для нашего ресурса, чтобы выполнить запрос PUT

var app = angular.module('app', ['ngResource', 'ngRoute']);

// Some APIs expect a PUT request in the format URL/object/ID
// Here we are creating an 'update' method
app.factory('Notes', ['$resource', function($resource) {
return $resource('/notes/:id', null,
    {
        'update': { method:'PUT' }
    });
}]);

// In our controller we get the ID from the URL using ngRoute and $routeParams
// We pass in $routeParams and our Notes factory along with $scope
app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
                                   function($scope, $routeParams, Notes) {
// First get a note object from the factory
var note = Notes.get({ id:$routeParams.id });
$id = note.id;

// Now call update passing in the ID first then the object you are updating
Notes.update({ id:$id }, note);

// This will PUT /notes/ID with the note object in the request payload
}]);

Отмена запросов

Если конфигурация действия указывает, что оно отменяемо, можно отменить запрос, связанный с экземпляром или коллекцией (пока это результат вызова "не экземпляра"):

// ...defining the `Hotel` resource...
var Hotel = $resource('/api/hotel/:id', {id: '@id'}, {
  // Let's make the `query()` method cancellable
  query: {method: 'get', isArray: true, cancellable: true}
});

// ...somewhere in the PlanVacationController...
...
this.onDestinationChanged = function onDestinationChanged(destination) {
  // We don't care about any pending request for hotels
  // in a different destination any more
  this.availableHotels.$cancelRequest();

  // Let's query for hotels in '<destination>'
  // (calls: /api/hotel?location=<destination>)
  this.availableHotels = Hotel.query({location: destination});
};

© 2010–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.6.9/docs/api/ngResource/service/$resource

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API