Spec-Zone.ru › Angular.js 1.4

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

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

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

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

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

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

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

Зависимости

  • $http

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

$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.

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)|Array.<function(data, headersGetter)>} – функция преобразования или массив таких функций. Функция преобразования принимает тело и заголовки HTTP-ответа и возвращает его преобразованную (обычно десериализованную) версию. По умолчанию transformResponse будет содержать одну функцию, которая проверяет, похож ли ответ на JSON-строку, и десериализует его с помощью angular.fromJson. Чтобы предотвратить это поведение, установите transformResponse в пустой массив: transformResponse: []
  • cache – {boolean|Cache} – Если true, будет использоваться кэш $http по умолчанию для кэширования GET-запроса, иначе, если создан экземпляр кэша с помощью $cacheFactory, этот кэш будет использоваться для кэширования.
  • timeout – {number} – таймаут в миллисекундах.
    Примечание: В отличие от $http.config, обещания не поддерживаются в $resource, поскольку одно и то же значение будет использоваться для нескольких запросов. Если вам нужна поддержка отменяемых действий $resource, необходимо обновить до версии 1.5 или выше.
  • withCredentials - {boolean} - нужно ли установить флаг withCredentials в объекте XHR. Более подробная информация о запросах с учётными данными находится в ссылке.
  • responseType - {string} - см. requestType.
  • interceptor - {Object=} - Объект интерцептора имеет два необязательных метода — response и responseError. Оба интерцептора response и responseError вызываются с объектом http response. Смотрите $http интерцепторы.
options Object

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

Где:

  • stripTrailingSlashes – {логическое} – Если true, от любой рассчитанной URL-адреса будут удалены конечные слеши. (По умолчанию true.)

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

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

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

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

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

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

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

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

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

    При ошибке обещание отклоняется с объектом ответа http, без свойства resource.

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

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

Ресурс кредитной карты

// 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(u, getResponseHeaders){
  u.abc = true;
  u.$save(function(u, putResponseHeaders) {
    //u => 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
}]);

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

Spec-Zone.ru

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