AngularJS: получать значения строки запроса без хеша в ссылке

Я пытаюсь получить значения строки запроса с помощью angularjs.

мой адрес: http://localhost/example.php?sportsId=3

когда я применил var goto = $location.search()['sportsId']; он возвращает меня undefined.

Однако, если я добавлю хэш в url как Url: http://localhost/example.php#?sportsId=3

то он вернет мне правильное значение 3.

Но в этом случае он также дает мне Error: [$parse:syntax] http://errors.angularjs.org/1.3.8/$parse/syntax?p0=undefined&p1=not%20a%20primary%20expression&p2=null&p3=sportsID%3D&p4=sportsID%3D

Кроме того, мой default $_REQUEST['sportsId'] не работает с хэш-форматом.

Как правильно получить значения из строки запроса с помощью angularjs?

Ответ 1

Я знаю, что это не Angular, а его чистый JS и работает как шарм (просто не добавляйте dummyPath, и он примет URL-адрес).

function getUrlParameter(param, dummyPath) {
        var sPageURL = dummyPath || window.location.search.substring(1),
            sURLVariables = sPageURL.split(/[&||?]/),
            res;

        for (var i = 0; i < sURLVariables.length; i += 1) {
            var paramName = sURLVariables[i],
                sParameterName = (paramName || '').split('=');

            if (sParameterName[0] === param) {
                res = sParameterName[1];
            }
        }

        return res;
}

Использование:

var sportdsId = getUrlParameter('sportsId');

Ответ 3

Вам нужно использовать

$location.search()

Это возвращает объект с вашими параметрами, поэтому давайте скажем, что у вас есть URL param1 = значение &? param2 = val2

Это даст следующую информацию

{ param1 : val, param2 : val2 }

Также убедитесь, что вы включили

$locationProvider.html5Mode(true);  

Ответ 4

Создайте свой объект поиска из свойства $window.location.search, используя следующее:

    var search = $window.location.search
            .split(/[&||?]/)
            .filter(function (x) { return x.indexOf("=") > -1; })
            .map(function (x) { return x.split(/=/); })
            .map(function (x) {
                x[1] = x[1].replace(/\+/g, " ");
                return x;
            })
            .reduce(function (acc, current) {
                acc[current[0]] = current[1];
                return acc;
            }, {});

    var sportsId = search.sportsId;

или создайте queryString factory, который вы можете использовать где угодно. Это объединяет левую и правую части queryString.. I.e. до # и после #

(function () {
    "use strict";

    angular
        .module("myModuleName")
        .factory("queryString", QueryStringFactory);

    function QueryStringFactory($window, $location) {

        function search() {

            var left = $window.location.search
                .split(/[&||?]/)
                .filter(function (x) { return x.indexOf("=") > -1; })
                .map(function (x) { return x.split(/=/); })
                .map(function (x) {
                    x[1] = x[1].replace(/\+/g, " ");
                    return x;
                })
                .reduce(function (acc, current) {
                    acc[current[0]] = current[1];
                    return acc;
                }, {});

            var right = $location.search() || {};

            var leftAndRight = Object.keys(right)
                .reduce(function(acc, current) {
                    acc[current] = right[current];
                    return acc;
                }, left);

            return leftAndRight;
        }

        return {
            search: search
        };

    }

}());

использование:

var qs = queryString.search();
var sportsId = sq.sportsId;

Ответ 5

Три простых шага выполнили задание:

  • Конфигурация angular для режима HTML5, добавив следующий код к контроллеру/службе:

    app.config(['$ locationProvider', function ($ locationProvider) {    $ LocationProvider.html5Mode (истина);  }]);

  • Добавить базовый элемент в ваш HTML:

<base href="/">

Ответ 6

Это то, что я использую. Он по существу тот же, что и принятый ответ, но возвращает все параметры в качестве объекта и обрабатывает декодирование компонентов URL.

function getUrlParameters() {
    var pairs = window.location.search.substring(1).split(/[&?]/);
    var res = {}, i, pair;
    for (i = 0; i < pairs.length; i++) {
        pair = pairs[i].split('=');
        if (pair[1])
            res[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
    }
    return res;
}