2013-01-05 9 views
11

Chcę zmienić adres URL w mojej aplikacji angularjs na bieżąco, przechylając w polu wejściowym.Jak mogę zmienić parametry w url z AngularJS?

np.

  1. Zatrzymuję się na: http://localhost/test/year/2012
  2. będę zmieniać na stronie poprzez polu wejściowym roku, do 2013 roku, że Call My yearIsChanged funkcję, niż adres URL należy zmienić na http://localhost/test/year/2013
  3. Ale z mojego obecnego konfiguracja URL został zmieniony na http://localhost/test/year/2012/?year=2013

Moja konfiguracja modul.

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

działanie kontrolera:

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

Odpowiedz

7

$location.search stworzy url podobny:

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

który nie jest to, co chcesz. Trzeba użyć $location.url():

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

Ok, że prawidłowo zmienić adres URL. Ale z '$ location.url (...)' jest przeładowaniem strony, a parametr "' reloadOnSearch': false "nie działa. Ma AngularJS inny parametr dla np. 'reloadOnUrlChange'? – Silver52

+0

Your OverviewCtrl zostanie wykonany ponownie, gdy trasa rzeczywiście się zmieni (np. Nie po wprowadzeniu '2012'). – asgoth

+0

Jeśli wprowadzę coś w moim polu wejściowym, to kontroler zostanie ponownie zainicjowany i straciłem fokus pola wejściowego. Jest to problem, ponieważ nie mogę ustawić pola wejściowego dla każdej postaci. : D – Silver52

5

Właściwie jeśli użyjesz „szukaj”, a następnie $ usługa lokalizacji zmieni „szukaj” część adresu URL, zobacz URL spec. AngularJS wykryje, że routing nie zostanie zmieniony i ma możliwość ponownego załadowania kontrolera (reloadOnSearch:false).

Ale przy użyciu metod .url lub .path można zmieniać całe adresy URL, ale router AngularJS nie może wykryć, czy może ponownie użyć kontrolera, czy też nie. Tak więc jedyną opcją jest zastosowanie tabeli routingu do nowego adresu URL i ponowne zainicjowanie tras.

Aby osiągnąć swój cel (określonych adresów URL jak/rok/2012) bez regulatora ponownego ładowania można: dyrektywa

  1. przepisać ngView (i ewentualnie kilka zmian do domyślnego routingu w angularjs) i spróbować ponownie wykorzystaj zakresy. To brzmi jak dość havy zmiany.

  2. Nie używaj domyślnego routingu AngularJS i nie wprowadzaj pożądanych zachowań samodzielnie.

Oto sample Plunker który ilustruje drugą opcję (naciśnij mały niebieski przycisk w okienku podglądu, aby zobaczyć, jak zmiany adresu URL, a także sprawdzić przyciski Prev/Next przeglądarce użytkownika nie przeładować stronę/kontroler).

+0

Dziękujemy za rozwiązanie. Wypróbuję to. – Silver52

5

Należy zauważyć, że w trasie:

"kiedy ('/ test/rok/: Rok'"

BOLD słowo, to routeParam i nie jest szukaj plików.

Więc jeśli chcesz zmienić trasę, należy użyć tego:

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 
    } 
    } 
Powiązane problemy