$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, время: 22:40. |