Como cancelo o evento de mudança de rota no AngularJs?
Meu código atual é
$rootScope.$on("$routeChangeStart", function (event, next, current) {
// do some validation checks
if(validation checks fails){
console.log("validation failed");
window.history.back(); // Cancel Route Change and stay on current page
}
});
com isso, mesmo se a validação falhar, o Angular puxa o próximo modelo e os dados associados e, em seguida, volta imediatamente para a visualização / rota anterior. Não quero que o angular extraia o próximo modelo e dados se a validação falhar, o ideal é que não haja window.history.back (). Eu até tentei event.preventDefault () mas não adiantou.
javascript
angularjs
R Arun
fonte
fonte
$routeChangeStart
anext
variável é apenas uma string e não pode conter nenhum dado (por exemplo, você não pode acessar aauthorizedRoles
variável anterior definida )$location.path()
e$location.search()
Um exemplo de código mais completo, usando
$locationChangeStart
Não estou completamente feliz em conectar isso ao meu controlador de raiz (controlador de nível superior). Se houver um padrão melhor, adoraria saber. Eu sou novo no angular :-)
fonte
Uma solução é transmitir um evento 'notAuthorized' e capturá-lo no escopo principal para alterar novamente o local. Acho que não é a melhor solução, mas funcionou para mim:
e no meu controlador principal:
Nota: há alguma discussão sobre este problema no site angular, ainda não resolvido: https://github.com/angular/angular.js/pull/4192
EDITAR:
Para responder ao comentário, aqui estão mais informações sobre os trabalhos do LoginService. Ele contém 3 funções:
(*) Minha sessão é preenchida quando a rota muda. Eu substituí o método when () para preencher a sessão quando vazia.
Aqui está o código:
fonte
LoginService.isAuthenticated()
no primeiro carregamento da página? Como você está armazenandocurrentUser
? O que acontece se o usuário atualizar a página (o usuário precisa inserir novamente as credenciais)?Para qualquer um que topar com esta é uma questão antiga, (pelo menos no angular 1.4) você pode fazer isso:
fonte
Esta é a minha solução e funciona para mim, mas não sei se estou no caminho certo porque sou novo nas tecnologias web.
fonte
eu achei este relevante
minha postagem pode ajudar alguém no futuro.
fonte
fonte
Caso você precise fazer parar a mudança de rota no
$routeChangeStart
evento (ou seja, você deseja realizar alguma operação baseada na próxima rota ), injete$route
e$routeChangeStart
chame:fonte
$route.reload()
precisa ser diferente ou então está executando o mesmo código novamente. Isso é equivalente a criar umwhile
loop comtrue
a condição.