Estou usando o angular 5. Tenho um painel onde tenho poucas seções com conteúdo pequeno e poucas seções com conteúdo tão grande que estou enfrentando um problema ao mudar de roteador enquanto vou para o topo. Sempre que preciso rolar para ir para o topo. Alguém pode me ajudar a resolver esse problema para que quando eu trocar de roteador minha visão fique sempre no topo.
Desde já, obrigado.
Respostas:
Existem algumas soluções, certifique-se de verificar todas :)
A saída do roteador emitirá o evento `activate` sempre que um novo componente estiver sendo instanciado, então podemos usar` (activate) `para rolar (por exemplo) para o topo:
app.component.html
app.component.ts
Use esta resposta para uma rolagem suave:
Se você deseja ser seletivo, digamos que nem todos os componentes devam acionar a rolagem, você pode verificar, então:
Desde o Angular6.1, também podemos usar `{scrollPositionRestoration: 'enabled'}` em módulos carregados rapidamente e será aplicado a todas as rotas:
Ele também fará a rolagem suave já. No entanto, isso tem o inconveniente de fazer isso em todos os roteamentos.
Uma outra solução é fazer a rolagem superior na animação do roteador. Adicione isso em cada transição em que deseja rolar para o topo:
fonte
window
objeto não estão funcionando no angular 5. Algum palpite por quê?Se você enfrentar esse problema no Angular 6, poderá corrigi-lo adicionando o parâmetro
scrollPositionRestoration: 'enabled'
ao RouterModule do app-routing.module.ts:fonte
scrollPositionRestoration
propriedade não funciona com conteúdo de página dinâmico (ou seja, onde o conteúdo da página é carregado de forma assíncrona): consulte este relatório de bug Angular: github.com/angular/angular /EDITAR: Para Angular 6+, use a resposta de Nimesh Nishara Indimagedara mencionando:
Resposta Original:
Se tudo falhar, crie algum elemento HTML vazio (por exemplo: div) na parte superior (ou role até o local desejado) com id = "top" no modelo (ou modelo pai):
E no componente:
fonte
Agora existe uma solução integrada disponível no Angular 6.1 com
scrollPositionRestoration
opção.Ver minha resposta em Angular 2 Vá para cima em Mudança de rota .
fonte
Embora @Vega forneça uma resposta direta à sua pergunta, existem problemas. Ele quebra o botão voltar / avançar do navegador. Se você clicar no botão voltar ou avançar do navegador, eles perderão seu lugar e serão rolados para a parte superior. Isso pode ser um pouco chato para seus usuários se eles tiverem que rolar para baixo para acessar um link e decidir clicar novamente para descobrir que a barra de rolagem foi redefinida para o topo.
Aqui está minha solução para o problema.
fonte
No meu caso, acabei de adicionar
em
ngOnInit()
e está funcionando bem.fonte
Da versão Angular 6+ Não há necessidade de usar window.scroll (0,0)
Para a versão Angular
6+
de @ representa as opções de configuração do roteador.docs
Pode-se usar
scrollPositionRestoration?: 'disabled' | 'enabled' | 'top'
emExemplo:
E se for necessário controlar manualmente a rolagem, não há necessidade de usar o
window.scroll(0,0)
pacote comum do Angular V6ViewPortScoller
.O uso é bastante simples. Exemplo:
fonte
se você estiver usando mat-sidenav, forneça um id para a saída do roteador (se você tiver saídas de roteador pai e filho) e use a função ativar nela
<router-outlet id="main-content" (activate)="onActivate($event)">
e use este seletor de consulta 'mat-sidenav-content' para rolar para cimaonActivate(event) { document.querySelector("mat-sidenav-content").scrollTo(0, 0); }
fonte
id
(tenho umrouter-outlet
no meu aplicativo). Eu também fiz isso de uma forma mais 'angular':@ViewChild(MatSidenavContainer) sidenavContainer: MatSidenavContainer; onActivate() { this.sidenavContainer.scrollable.scrollTo({ left: 0, top: 0 }); }
Eu continuo procurando uma solução embutida para este problema como existe no AngularJS. Mas até então essa solução funciona para mim, é simples e preserva a funcionalidade do botão Voltar.
app.component.html
app.component.ts
Resposta da postagem original do zurfyx
fonte
Você só precisa criar uma função que contenha o ajuste de rolagem da tela
por exemplo
window.scrollTo (xpos, ypos) -> parâmetro esperado.
fonte
Aqui está uma solução que só rola para o topo do componente se você visitar pela primeira vez CADA componente (no caso de você precisar fazer algo diferente por componente):
Em cada componente:
fonte
fonte
Angular 6.1 e posterior:
Você pode usar a solução integrada disponível no Angular 6.1+ com a opção de
scrollPositionRestoration: 'enabled'
fazer o mesmo.Angular 6.0 e anterior:
Observação: o comportamento esperado é que, ao navegar de volta para a página, ela deve permanecer rolada para baixo até o mesmo local em que estava quando você clicou no link, mas rolando para o topo ao chegar a cada página.
fonte
apenas adicione
window.scrollTo({ top: 0);
para ngOnInit ()
fonte
Para alguém que está procurando a função de rolagem, basta adicionar a função e chamar sempre que necessário
fonte
Experimente isto:
app.component.ts
fonte
Componente: Inscreva-se em todos os eventos de roteamento em vez de criar uma ação no modelo e role em NavigationEnd b / c, caso contrário, você o disparará em navs ruins ou rotas bloqueadas, etc ... Esta é uma maneira segura de saber se uma rota é navegada com sucesso e, em seguida, role a tela. Caso contrário, não faça nada.
HTML
fonte
tente isso
este código suportava angular 6 <=
fonte