Улучшить эту документацию Посмотреть исходный код $resource
- $resourceProvider
- сервис в модуле ngResource
Фабрика, которая создает объект ресурса, позволяющий взаимодействовать с RESTful источниками данных на стороне сервера.
Возвращаемый объект ресурса имеет методы действий, которые обеспечивают высокоуровневое поведение без необходимости взаимодействия с низкоуровневым сервисом $http.
Требуется модуль ngResource для установки.
По умолчанию, конечные косые черты будут удалены из рассчитанных URL-адресов, что может создавать проблемы с серверными бэкендами, которые не ожидают этого поведения. Это можно отключить, настроив $resourceProvider следующим образом:
app.config(['$resourceProvider', function($resourceProvider) {
// Don't strip trailing slashes from calculated URLs
$resourceProvider.defaults.stripTrailingSlashes = false;
}]);
Зависимости
Использование
$resource(url, [paramDefaults], [actions], options);
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| url | string | Шаблон параметризованного URL-адреса с параметрами, которые начинаются с Если вы используете URL с суффиксом, просто добавьте суффикс, например: |
| paramDefaults (необязательно) | Object | Значения по умолчанию для параметров Каждое значение ключа в объекте параметров сначала привязывается к шаблону URL, если он присутствует, а затем все дополнительные ключи добавляются к строке запроса URL после Учитывая шаблон Если значение параметра начинается с |
| actions (необязательно) | Object.<Object>= | Хэш с объявлением пользовательских действий, которые должны расширить стандартный набор действий ресурса. Объявление должно быть создано в формате $http.config: {action1: {method:?, params:?, isArray:?, headers:?, ...},
action2: {method:?, params:?, isArray:?, headers:?, ...},
...}
Где:
|
| options | Object | Хэш с пользовательскими настройками, которые должны расширить стандартное поведение
|
Возвращает
Object |
Объект ресурса "класса" с методами для набора стандартных действий над ресурсами, дополнительно расширяемых пользовательскими { 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} };
Вызов этих методов запускает запрос var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
});
Важно понимать, что вызов метода объекта $resource немедленно возвращает пустую ссылку (объект или массив, в зависимости от Методы действий объекта класса или экземпляра объекта могут быть вызваны со следующими параметрами:
Обработчик успеха вызывается с аргументами (значение (Объект|Массив), заголовки ответа (Функция), статус (число), текст статуса (строка)), где значение — это заполненный экземпляр или коллекция ресурса. Обработчик ошибок вызывается с аргументом (ответ HTTP). Действия класса возвращают пустой экземпляр (с дополнительными свойствами ниже). Действия экземпляра возвращают обещание выполнения действия. Экземпляры и коллекции ресурсов имеют следующие дополнительные свойства:
|
Ресурс кредитной карты
// 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