Spec-Zone.ru › Angular.js 1.3

Улучшить эту документацию Просмотреть исходный код $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 – {Object=} – Необязательный набор предварительно связанных параметров для этого действия. Если какое-либо значение параметра является функцией, она будет выполняться каждый раз, когда необходимо получить значение параметра для запроса (если параметр не был переопределён).
  • 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 интерцепторы.
options Object

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

Где:

  • stripTrailingSlashes – {логическое значение} – Если true, trailing-слеши из любого рассчитанного 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: обещание promise исходного взаимодействия с сервером, которое создало этот экземпляр или коллекцию.

    При успехе обещание разрешается тем же экземпляром или коллекцией ресурса, обновлённым данными с сервера. Это упрощает использование в разделе разрешения $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.3.20/docs/api/ngResource/service/$resource

Spec-Zone.ru

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