AngularJS - изменить $location молча - удалить строку запроса

Есть ли способ тихо изменить маршрут в строке url с помощью angular?

Пользователь нажимает ссылку для сообщения электронной почты, которое:

/verificationExecuted?verificationCode=xxxxxx

Когда загружается страница, я хочу прочитать проверочный код, а затем очистить его:

 if($location.path() == '/verificationExecuted'){
     this.registrationCode = this.$location.search()["verificationCode"];
     this.$location.search("verificationCode", null); //Uncomment but make this silent!

     if(registrationCode != null) {
         ....
     }
     else $location.path("/404");      
 }

Что происходит, когда я очищаю его, остается оставшаяся часть маршрута ( "/verificationExecuted" ) остается, но повторяет триггеры маршрута, поэтому он снова появляется без кода подтверждения и переходит прямо к 404.

Я хочу удалить код, не делая ничего другого.

Ответ 1

Вы всегда можете установить опцию reloadOnSearch на вашем маршруте как false.

Это предотвратит перезагрузку маршрута, если изменяется только строка запроса:

$routeProvider.when("/path/to/my/route",{
   controller: 'MyController',
   templateUrl: '/path/to/template.html',
   //Secret Sauce
   reloadOnSearch: false
});

Ответ 2

попробуйте это

$location.url($location.path())

Подробнее о $location

см. ,

Ответ 3

У меня было аналогичное требование для одного из моих проектов.

В этом случае я использовал сервис.

app.factory('queryData', function () {
    var data;

    return {
        get: function () {
            return data;
        },
        set: function (newData) {
            data = newData
        }
    };
});

Эта служба затем использовалась в моем контроллере как:

app.controller('TestCtrl', ['$scope', '$location', 'queryData',
    function ($scope, $location, queryData) {
        var queryParam = $location.search()['myParam'];
        if (queryParam) {
            //Store it
            queryData.set(queryParam);
            //Reload same page without query argument
            $location.path('/same/path/without/argument');
        } else {
            //Use the service
            queryParam = queryData.get();
            if (queryParam) {
                //Reset it so that the next cycle works correctly
                queryData.set();
            }
            else {
                //404 - nobody seems to have the query
                $location.path('/404');
            }
        }
    }
]);