Spec-Zone.ru › Angular.js 1.5

Улучшить эту документацию Посмотреть исходный код $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 (предоставленного при вызове метода действия "не-GET"). Например, если объект defaultParam равен {someParam: '@someProp'}, то значение someParam будет data.someProp. Обратите внимание, что параметр будет пропущен при вызове метода действия "GET" (т.е. метода действия, который не принимает тело запроса).

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

Хэш с объявлением пользовательских действий, которые должны расширить стандартный набор действий ресурса. Объявление должно быть создано в формате $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, иначе, если есть экземпляр кэша, созданный с помощью $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 interceptors.
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). После возвращения данных сервером, существующая ссылка заполняется фактическими данными. Это полезный трюк, так как обычно ресурс присваивается модели, которая затем отображается представлением. Наличие пустого объекта не приводит к отображению, а после получения данных с сервера объект заполняется данными, и представление автоматически перерисовывается, показывая новые данные. Это означает, что в большинстве случаев не нужно писать функцию обратного вызова для методов действия.

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

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

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

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

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

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

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

    При неудаче обещание отклоняется с объектом ответа HTTP, без свойства resource.

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

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

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

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

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

  • toJSON: Возвращает простой объект без каких-либо дополнительных свойств, добавленных в рамках API ресурсов. Этот объект может быть сериализован с помощью angular.toJson безопасно без присоединения специфичных для Angular полей. Обратите внимание, что 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–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/ngResource/service/$resource

Spec-Zone.ru

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