Spec-Zone.ru › Angular.js 1.2

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

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

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

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

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

Зависимости

  • $http

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

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

Аргументы

Параметр Тип Подробности
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|Promise} – таймаут в миллисекундах или обещание, которое должно прервать запрос при разрешении.
  • withCredentials - {boolean} - нужно ли установить флаг withCredentials в объекте XHR. См. запросы с учетными данными для получения дополнительной информации.
  • responseType - {string} - см. requestType.
  • interceptor - {Object=} - Объект интерцептора имеет два необязательных метода - response и responseError. Оба интерцептора response и responseError вызываются с объектом http response. См. $http интерцепторы.

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

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])

    Обработчик успеха вызывается с аргументами (значение, заголовки ответа). Обработчик ошибки вызывается с аргументом (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.2.32/docs/api/ngResource/service/$resource

Spec-Zone.ru

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