Как использовать URL-адреса запросов, подобные ngResource, с $http

Я использую Angular, и мне нужно сделать несколько неуспокоительных вызовов ajax. И из-за этого я не могу использовать ngResource. Мой URL-адрес что-то вроде /admin/:someId или /admin/:someId/users/:someUserId.

Методы ngResource просто анализируют эти токены, но есть ли способ использовать эти URL-адреса с объектом $http?

Я открываю свои внутренние маршруты для javascript следующим образом: /slug/:param1/slug/:param2. С помощью методов ngResource мне нужно сделать следующее, чтобы заставить его работать: Resource.query({param1: someValue, param2: anotherValue});. Проблема в том, что я не могу использовать ngResource в этом случае, и я не могу заставить его работать с методом $http.get, он не заменяет токены :param1 и :param2 для значений. Он просто вызывает /slug/:param1/slug/:param2.


person Astaroth    schedule 16.11.2015    source источник
comment
Можете ли вы быть немного более конкретным о том, что вы хотите сделать? Вы можете определенно вызывать сокращенные методы $http, такие как $http.get(), $http.post(), $http.put и т. д., которые возвращают обещание, которое позволяет вам связать его с методом then(). Этот URL-адрес выглядит нормально для меня, это просто означает, что с этими дополнительными параметрами требуется немного больше обработки. Вероятно, вы можете соединить их с $routeParams, чтобы получить эти токены.   -  person TheLazyChap    schedule 16.11.2015
comment
Проблема в том, что $http не заменяет токены параметров значениями, я отредактировал свой первый пост.   -  person Astaroth    schedule 16.11.2015
comment
Итак, вы не можете использовать $routeParams.param1 и $routeParams.param2 и поместить их в $http.get(/slug/ + $routeParams.param1 + /slug/ + $routeParams.param2).then(cb).catch(err ); возможно, я что-то неправильно понял.   -  person TheLazyChap    schedule 16.11.2015
comment
Нет, я предоставляю свои URL-адреса с сервера, такие как /slug/:param1/slug/:param2, как строковые переменные JavaScript. Таким образом, мне не нужно делать грязную конкатенацию. Я знаю, что если методы ngResource автоматически заменяют токены запроса, должен быть способ сделать это с использованием той же службы, которую использует Angular, но я не могу найти никакой информации об этом.   -  person Astaroth    schedule 16.11.2015
comment
Возможно, вам следует вернуться к использованию $resource ... $http определенно не делает ничего с параметрами. Какие реальные проблемы у вас возникли при использовании $resource?   -  person Sunil D.    schedule 16.11.2015
comment
Я просто не делаю запросы на отдых. Поэтому я думаю, что нельзя использовать ngResource. Мне нужно отправить 2 списка на сервер, чтобы обновить оба. Эти списки зависят от :departmentId, который находится в URL-адресе.   -  person Astaroth    schedule 16.11.2015


Ответы (1)


На всякий случай, если кто-то найдет эту тему, я закончил это:

.factory('RouteUtils', function () {
return {
    /**
     * Replaces all token appearances with their corresponding value.
     * 
     * @param string route The route that has the tokens you want to replace. Tokens must be like ":someString".
     * @param object params Object of parameters. It must be key value. For example: {firstKey: 34, secondKey: 'I'm some string'}.
     * 
     * @returns string Token replaced route.
     */
    parse: function (route, params) {
        var propNames = Object.getOwnPropertyNames(params);
        propNames.forEach(function (propName) {
            route = route.replace(':' + propName, encodeURI(params[propName]))
        });

        return route;
    }
};

})

Затем при вызове $http:

.factory('SomeFactory', function ($http, RouteUtils) {
    return {
        someGetCall: function (params) {
            return $http.get(RouteUtils.parse(routeGet, params));
        },
        somePostCall: function (params) {
            return $http.post(RouteUtils.parse(routePost, params), {
                postParam1: 'postValue1',
                postParam2: 'postValue2'
            });
        },
    };
})

Будучи переменной route, например, /user/:userId/games/:gameId/, и params, например, {userId: 34, gameId: 55}, метод parse вернет /user/34/games/55/.

Это лучшее решение, которое я мог придумать, так как я не смог найти собственный способ Angular сделать это.

person Astaroth    schedule 20.11.2015