Улучшить эту документацию Просмотреть исходный код $resource
- сервис в модуле 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 немедленно возвращает пустую ссылку (объект или массив в зависимости от Методы действия в объекте класса или экземпляра объекта можно вызвать с помощью следующих параметров:
Функция обратного вызова при успехе вызывается с аргументами (значение, заголовки ответа). Функция обратного вызова при ошибке вызывается с аргументом (httpResponse). Действия класса возвращают пустой экземпляр (с дополнительными свойствами ниже). Действия экземпляра возвращают обещание действия. Экземпляры и коллекции ресурсов имеют следующие дополнительные свойства:
|
Ресурс карты кредита
// 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