$resource custom action query
Не могу понять, почему не удается сформировать строку вида
http://myrest/v1/users?page=5 из приеденных ниже ресурсов правильную строку дает только good
app.constant('userUrl', 'http://myrest/v1/users/');
app.constant('userUrlPagination', 'http://myrest/v1/users');
app.factory('Users', ['$http', '$rootScope', '$resource', '$location', 'toaster','userUrl','userUrlPagination',
function ($http, $rootScope, $resource, $location, toaster, userUrl,userUrlPagination) {
var bad = $resource(userUrl + ":id", {id: '@id', page: 5});
var good = $resource(userUrlPagination + "?page=:page", {page: 5});
Хотя в мануале https://code.angularjs.org/1.3.18/do...vice/$resource черным по белому написано, что вот это должно работать. ...Given a template /path/:verb and parameter {verb:'greet', salutation:'Hello'} results in URL /path/greet?salutation=Hello ... |
В общем помогите настроить единый $resource, чтобы он формировал и такую строку .../users/32 и такую .../users?page=1. Что то я разобраться не могу, приходится откатываться на сервис $http
|
Не дожидаясь ответа, рад сообщить. Я догадался. Видимо сильно кое где зудило... и так:
1. Возможно я направил свои и ваши мысли в неверно русло и не совсем корректно изложил задачу. 2. Оказывается $resource на то и ресурс, он же источник, единый и есть на самом деле. И у него есть действия action в которых можно настроить url и параметры! Вот оно! И выглядит это так:
app.constant('baseUrl', 'http://myrest/v1/users');
app.factory('Users', ['$http', '$rootScope', '$resource', '$location', 'toaster', 'baseUrl',
function ($http, $rootScope, $resource, $location, toaster, baseUrl) {
var itemsResource = $resource(baseUrl + "/" + ":id", {id: '@id'}, {
// тот самый custom action
paginationQuery: {
method: 'GET',
params: {pp: 3, p: 1},
url: baseUrl + "?page=:p&per-page=:pp",
isArray: true
}
});
var currentItem = {};
var items = [];
function getItems() {
var promise = itemsResource.paginationQuery().$promise;
promise.then(fulfilled, rejected)
function fulfilled(data) {
items = data;
$rootScope.$broadcast('items:updated');
}
function rejected(data) {
console.log(data);
}
}
}
В итоге код работает как надо. Источник один общий. Действия delete save и тд работают стандартно. Однако есть просьба. Помогите код сделать по-красивее, а то местами выглядит не очень. Я еще только учусь. |
Будьте осторожны, созданный с помощью фабрики объект будет заменять свои данные при вызове методов. Если Вы думаете, что получится сделать так:
var item = ItemResource.get({id: 2});
а потом item_comments = item.getComments(); будьте готовы к тому, что исходный объект item будет заменён на результат вызова метода getComments. Лучше сделайте отдельные ресурсы под каждую сущность. |
| Часовой пояс GMT +3, время: 21:56. |