Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   $resource paramDefauls (https://javascript.ru/forum/angular/57859-%24resource-paramdefauls.html)

afanasev 23.08.2015 20:49

$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 ...

afanasev 24.08.2015 07:57

В общем помогите настроить единый $resource, чтобы он формировал и такую строку .../users/32 и такую .../users?page=1. Что то я разобраться не могу, приходится откатываться на сервис $http

afanasev 24.08.2015 23:02

Не дожидаясь ответа, рад сообщить. Я догадался. Видимо сильно кое где зудило... и так:

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 и тд работают стандартно.

Однако есть просьба. Помогите код сделать по-красивее, а то местами выглядит не очень. Я еще только учусь.

dunmaksim 27.08.2015 09:26

Будьте осторожны, созданный с помощью фабрики объект будет заменять свои данные при вызове методов. Если Вы думаете, что получится сделать так:

var item = ItemResource.get({id: 2});


а потом

item_comments = item.getComments();


будьте готовы к тому, что исходный объект item будет заменён на результат вызова метода getComments. Лучше сделайте отдельные ресурсы под каждую сущность.


Часовой пояс GMT +3, время: 20:09.