Улучшить эту документацию Просмотреть исходный код $resource
- сервис в модуле ngResource
Фабрика, которая создаёт объект ресурса, позволяющий взаимодействовать с RESTful источниками данных на стороне сервера.
Возвращаемый объект ресурса имеет методы действий, обеспечивающие высокоуровневое поведение без необходимости взаимодействия с низкоуровневым сервисом $http.
Требуется установка модуля ngResource.
Зависимости
Использование
$resource(url, [paramDefaults], [actions]);
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| url | string | Шаблон параметризованного URL с параметрами, представленными префиксом Если вы используете URL с суффиксом, просто добавьте суффикс, например: |
| paramDefaults (необязательно) | Object | Значения по умолчанию для параметров Каждое значение ключа в объекте параметров сначала привязывается к шаблону URL, если он есть, а затем любые лишние ключи добавляются к поисковой строке URL после Учитывая шаблон Если значение параметра имеет префикс |
| actions (необязательно) | Object.<Object>= | Хэш с объявлением пользовательского действия, которое должно расширять стандартный набор действий ресурса. Объявление должно создаваться в формате $http.config: {action1: {method:?, params:?, isArray:?, headers:?, ...},
action2: {method:?, params:?, isArray:?, headers:?, ...},
...}
Где:
|
Возвращаемое значение
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 сразу возвращает пустую ссылку (объект или массив, в зависимости от Методы действий в объекте класса или экземпляра объекта можно вызывать со следующими параметрами:
|
Ресурс карты кредита
// 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