Подтвердить что ты не робот

Как изменить параметры в url с помощью AngularJS?

Я хочу изменить url в моем приложении angularjs на лету, опрокинувшись во входном поле.

например.

  • Я остаюсь: http://localhost/test/year/2012
  • Я изменюсь сбоку через поле ввода в год до 2013 года, которое вызывает мою функцию yearIsChanged, чем URL-адрес должен быть изменен на http://localhost/test/year/2013
  • Но с моей текущей конфигурацией URL-адрес изменен на http://localhost/test/year/2012/?year=2013

Модная конфигурация.

var module = angular.module('exampleApp').
config(['$routeProvider', function ($routeProvider) {
    $routeProvider.
        when('/test/year/:year', {templateUrl: 'partials/test.html', controller: OverviewCtrl, reloadOnSearch: false}).
        otherwise({redirectTo: '/'});
}]);

Действие контроллера:

 function OverviewCtrl($scope,$routeParams, $location) {
      $scope.yearIsChanged = function () {
        $location.search('year', $scope.year);
    }   
}
4b9b3361

Ответ 1

$location.search создаст URL-адрес, например:

http://localhost/test/year/2012?year=2013

который не то, что вы хотите. Вам нужно использовать $location.url():

function OverviewCtrl($scope,$routeParams, $location) {
      $scope.yearIsChanged = function () {
        $location.url('/test/year/' + $scope.year);
    }   
}

Ответ 2

Фактически, если вы будете использовать "поиск", тогда служба определения местоположения изменит "поиск" части URL-адреса, см. URL-спецификация. Поэтому AngularJS обнаружит, что маршрутизация не будет изменена и имеет возможность не перезагружать контроллер (reloadOnSearch:false).

Но использование методов .url или .path может изменять целые URL-адреса, но маршрутизатор AngularJS не может обнаружить, может ли он повторно использовать контроллер или нет. Таким образом, единственным вариантом является применение таблицы маршрутизации к новому URL-адресу и повторная инициализация маршрутов.

Чтобы достичь своей цели (конкретные URL-адреса, например/год/2012) без контроллера повторной загрузки, вы можете:

  • переписать директиву ngView (и, возможно, некоторые изменения в маршрутизации по умолчанию в AngularJS) и попытаться повторно использовать области. Это звучит как довольно тяжелое изменение.

  • Не используйте маршрутизацию по умолчанию AngularJS и самостоятельно реализуйте желаемое поведение.

Вот образец Plunker, который иллюстрирует второй вариант (нажмите маленькую синюю кнопку в области предварительного просмотра, чтобы увидеть, как изменяется URL-адрес, а также убедитесь, что предыдущие/следующие кнопки браузера не перезагружают страницу/контроллер).

Ответ 3

Вы должны заметить, что на вашем маршруте:

", когда ('/test/year/: year'"

слово BOLD - это маршрутParam и не.

Итак, если вы хотите изменить маршрут, вы должны использовать это:

    function OverviewCtrl($scope,$routeParams, $location) {
      $scope.yearIsChanged = function () {
       $location.path('/test/year/'+$scope.year)
     // .path() will set(or get) your routeParams 
     // .search() will set(or get) your seach fields like your error
     }   
   }