2012-12-19 11 views
7

Widzę zdarzenie $routeChangeStart w moim kontrolerze, ale nie widzę, jak powiedzieć Angularowi, żeby został. Muszę wyskoczyć coś w stylu "Czy chcesz ZAPISZ, USUNĄĆ lub ANULOWAĆ?" i pozostanie na aktualnej "stronie", jeśli użytkownik wybierze anuluj. Nie widzę żadnych zdarzeń, które umożliwiają słuchaczom anulowanie zmiany trasy.AngularJS - Wykrywanie, przeciąganie i anulowanie zmian trasy

Odpowiedz

15

Słuchasz niewłaściwego wydarzenia, trochę googlowałem, ale nie znalazłem niczego w dokumentach. Szybki test tego:

$scope.$on("$locationChangeStart", function(event){ 
    event.preventDefault(); 
}) 

W globalnym kontrolerze uniemożliwiono zmianę lokalizacji.

+3

jak kontynuować zmianę? Na przykład - wyświetl komunikat "Czy chcesz zmienić stronę?" - Tak - Nie. Tak - kontynuuj, zatrzymując się na "NIE". –

+0

To nie jest dobre, jeśli potrzebujesz dostępu do parametrów trasy. Naprawdę irytujące, że trasy nie można anulować od zdarzenia rozpoczęcia zmiany trasy. – KingOfHypocrites

+1

Nie. W ogóle nie anuluje zmiany lokalizacji trasy, AFAICT. Wydaje się, że event.preventDefault() nie robi nic. –

2

Udokumentowanym sposobem wykonania tej czynności jest użycie właściwości resolve tras.

Dokumentacja serwisowa "$ route" mówi, że zdarzenie "$ routeChangeError" jest uruchamiane, jeśli którekolwiek z obietnic "rozwiązania" zostanie odrzucone. 1 To oznacza, że ​​możesz użyć "$ routeProvider", aby określić funkcję, która zwraca obietnicę, która zostanie później odrzucona, jeśli chcesz zapobiec zmianie trasy.

Zaletą tej metody jest to, że obietnica może zostać rozwiązana lub odrzucona na podstawie wyników zadań asynchronicznych.

+2

Ale nawet po odrzuceniu adres URL przeglądarki zostanie zmieniony. Jak sobie z tym poradzić? – FelikZ

+0

Możesz zmienić lokalizację z powrotem za pomocą usługi, która obserwuje zakres główny dla $ locationChangeSuccess. Właśnie to usługa $ route używa wewnętrznie, ale nie wiem, czy można w pełni polegać na jej publicznym zachowaniu w przyszłości. Jednak możesz teraz połączyć to z $ routeChangeError, aby przywrócić starą lokalizację. Być może warto zapytać o to opiekunów. – tilgovi

+1

@FelikZ FYI, odpowiednim zagadnieniem do obejrzenia jest https://github.com/angular/angular.js/issues/2100 – Sam

0
$scope.$watch("$locationChangeStart", function(event){ 
    event.preventDefault(); 
}); 

Można zrobić tak jak dobrze. Korzyści z wykonywania tego sposobu jest to, że nie wyzwala poprzez if() oświadczenie z $ na ... jak dobrze zobaczyć że poniżej kod wywoła bez względu na warunek:

if(condition){ //it doesn't matter what the condition is true or false 
    $scope.$on("$locationChangeStart", function(event){ //this gets triggered 
    event.preventDefault(); 
    }); 
} 
Powiązane problemy