Como mostro uma tela de carregamento quando altero uma rota no Angular 2?
html
css
angular
angular2-routing
Lucas
fonte
fonte
Respostas:
O atual roteador angular fornece eventos de navegação. Você pode assinar e fazer alterações na interface do usuário de acordo. Lembre-se de contar em outros eventos, como
NavigationCancel
eNavigationError
para interromper seu controle giratório, caso as transições do roteador falhem.app.component.ts - seu componente raiz
app.component.html - sua visualização raiz
Resposta aprimorada do desempenho : Se você se importa com o desempenho, existe um método melhor, é um pouco mais tedioso de implementar, mas a melhoria do desempenho valerá o trabalho extra. Em vez de usar
*ngIf
para mostrar condicionalmente o botão giratório, poderíamos alavancar o AngularNgZone
eRenderer
ativar / desativar o botão giratório, que ignorará a detecção de alterações do Angular quando mudarmos o estado do botão giratório. Achei isso para tornar a animação mais suave em comparação com o uso de*ngIf
umasync
cachimbo.Isso é semelhante à minha resposta anterior com alguns ajustes:
app.component.ts - seu componente raiz
app.component.html - sua visualização raiz
fonte
router navigation
eit triggering the spinner
e depois não ser capaz de pará-lo.navigationInterceptor
parece uma solução, mas não tenho certeza se algo está esperando para ser quebrado. Se misturado comasync requests
ele, apresentará o problema novamente, eu acho.display
umnone
ou outroinline
.'md-spinner' is not a known element:
. Eu sou bastante novo no Angular. Poderia me dizer qual poderia ser o erro?ATUALIZAÇÃO: 3 Agora que eu atualizei para o novo roteador, a abordagem do @borislemke não funcionará se você usar o
CanDeactivate
guarda. Estou degradando o meu método antigo,ie:
esta respostaATUALIZAÇÃO2 : Os eventos do roteador no novo roteador parecem promissores e a resposta do @borislemke parece cobrir o principal aspecto da implementação do spinner. Não testei, mas recomendo.
UPDATE1: Eu escrevi esta resposta na era de
Old-Router
, quando costumava haver apenas um eventoroute-changed
notificado viarouter.subscribe()
. Também senti sobrecarga da abordagem abaixo e tentei fazê-la usando apenasrouter.subscribe()
, e ela saiu pela culatra porque não havia como detectarcanceled navigation
. Então eu tive que voltar à abordagem demorada (trabalho duplo).Se você conhece o Angular2, é disso que precisa
Boot.ts
Componente raiz (MyApp)
Spinner-Component (assinará o serviço Spinner para alterar o valor de ativo de acordo)
Serviço Spinner (inicie este serviço)
Defina um observável a ser inscrito pelo componente giratório para alterar o status em mudança e função para conhecer e definir o girador ativo / inativo.
Todos os outros componentes das rotas
(amostra):
fonte
spinner-service
enquanto, você só precisa de outras partes para fazê-lo funcionar. E lembre-se de que é paraangular2-rc-1
Por que não usar apenas css simples:
E nos seus estilos:
Ou ainda podemos fazer isso pela primeira resposta:
E então simplesmente
O truque aqui é que as novas rotas e componentes sempre aparecerão após a saída do roteador , portanto, com um simples seletor de css, podemos mostrar e ocultar o carregamento.
fonte
Se você tiver uma lógica especial necessária apenas para a primeira rota, poderá fazer o seguinte:
AppComponent
Eu precisava disso para ocultar o rodapé da minha página, que de outra forma aparecia na parte superior da página. Além disso, se você quiser apenas um carregador para a primeira página, poderá usá-lo.
fonte
Você também pode usar esta solução existente . A demo está aqui . Parece barra de carregamento do youtube. Acabei de encontrá-lo e adicioná-lo ao meu próprio projeto.
fonte