Desejo adicionar alguns links em minha página Angular2, que quando clicados, irão pular para posições específicas dentro daquela página, como o que as hashtags normais fazem. Portanto, os links seriam algo como
/users/123#userInfo
/users/123#userPhoto
/users/123#userLikes
etc.
Não acho que preciso de HashLocationStrategy, já que estou bem com a forma normal do Angular2, mas se eu adicionar diretamente, o link vai realmente pular para a raiz, não para algum lugar na mesma página. Qualquer direção é apreciada, obrigado.
123
está em questão) assumindo que o caminho da rota espera um parâmetro como{ path: 'users/:id', ....}
01
ou100
não são seletores CSS válidos. Você pode querer adicionar uma letra ou algo para torná-lo um seletor válido. Portanto, você ainda passaria01
por um fragmento, mas oid
precisaria ser algo semelhanted01
e, portantodocument.querySelector('#d'+id)
, corresponderia.Embora a resposta de Günter esteja correta, ela não cobre o "salto para" a parte da etiqueta de âncora .
Portanto, além de:
... no componente (pai) onde você precisa de um comportamento "pular para", adicione:
Observe que esta é uma solução alternativa ! Siga esta edição do github para atualizações futuras. Créditos a Victor Savkin por fornecer a solução!
fonte
"['../faq']"
o valor ou então ele tentará pular para / faq / faq / # anchor, insteaf de / faq / # anchor. Esta é a maneira correta de fazer isso ou existe uma maneira mais elegante de se referir à página atual no routerlink? Além disso,document.querySelector("#" + tree.fragment);
me dá um erro de seletor inválido. Tem certeza de que está correto? Obrigado<a [routerLink]="['/faq']" fragment="section6">
?Desculpe por responder um pouco tarde; Há uma função predefinida na Documentação de Roteamento Angular que nos ajuda a rotear com uma hashtag para a âncora da página, ou seja, anchorScrolling: 'enabled'
Etapa 1: - Primeiro importe o RouterModule no arquivo app.module.ts: -
Passo 2: - Vá para a página HTML, crie a navegação e adicione dois atributos importantes como [routerLink] e fragmento para combinar os respectivos Div IDs : -
Etapa 3: - Crie uma seção / div combinando o nome do ID com o fragmento : -
Para sua referência, adicionei o exemplo abaixo criando uma pequena demonstração que ajuda a resolver seu problema.
fonte
scrollPositionRestoration: 'enabled',
opção anchorScrolling :)Um pouco tarde, mas aqui está uma resposta que achei que funciona:
E no componente:
O exemplo acima não rola automaticamente para a visualização se você acessar uma página já com uma âncora, então usei a solução acima no meu ngInit para que ele pudesse funcionar com isso também:
Certifique-se de importar Router, ActivatedRoute e NavigationEnd no início de seu componente e deve estar tudo pronto para ir.
Fonte
fonte
document.querySelector ( "#" + f )
me dá um erro porque espera um seletor, não uma string.element.scrollIntoView()
(sem passarelement
para a função). Para torná-lo suave, use este:element.scrollIntoView({block: "end", behavior: "smooth"})
.onAnchorClick()
, temos de passar um booleano para scrollIntoView:if (element) { element.scrollIntoView(true); }
. Agora posso clicar duas vezes no mesmo link e rolar as obrasNenhuma das respostas anteriores funcionou para mim. Em um último esforço, tentei em meu modelo:
Com isso em meu .ts:
E funciona conforme o esperado para links internos. Na verdade, isso não usa marcas de âncora, portanto, não afetaria a URL de forma alguma.
fonte
As soluções acima não funcionaram para mim ... Esta funcionou:
Primeiro, prepare-se
MyAppComponent
para a rolagem automática em ngAfterViewChecked () ...Em seguida, navegue até o
my-app-route
envio deprodID
hashtagfonte
Todas as outras respostas funcionarão na versão Angular <6.1. Mas se você tiver a versão mais recente, não precisará fazer esses hacks horríveis, pois o Angular corrigiu o problema.
aqui está o link para o problema
Tudo o que você precisa fazer é definir
scrollOffset
a opção do segundo argumento doRouterModule.forRoot
método.fonte
Use isso para o módulo do roteador em
app-routing.module.ts
:Isso estará em seu HTML:
fonte
No arquivo html:
No arquivo ts:
fonte
Como a propriedade fragment ainda não fornece rolagem de âncora, esta solução alternativa funcionou para mim:
fonte
Acrescentando à resposta de Kalyoyan , esta assinatura está vinculada ao roteador e permanecerá ativa até que a página seja totalmente atualizada. Ao assinar eventos de roteador em um componente, certifique-se de cancelar a assinatura em ngOnDestroy:
fonte
Acabei de fazer isso funcionar em meu próprio site, então achei que valeria a pena postar minha solução aqui.
E então, em seu componente, certifique-se de incluir isto:
fonte
element.scrollIntoView()
ouelement.scrollIntoView(true)
. Sua versão não compilou para mim (talvez por causa de strictNullChecks?).Depois de ler todas as soluções, procurei um componente e encontrei um que faz exatamente o que a pergunta original pedia: rolar para ancorar links. https://www.npmjs.com/package/ng2-scroll-to
Ao instalá-lo, você usa uma sintaxe como:
Funcionou muito bem para mim.
fonte
Uma solução simples que funciona para páginas sem nenhum parâmetro de consulta é compatível com o navegador para trás / para a frente, roteador e link direto.
O tempo limite é simplesmente para permitir que a página carregue quaisquer dados dinâmicos "protegidos" por um * ngIf. Isso também pode ser usado para rolar para o topo da página ao alterar a rota - basta fornecer uma marca âncora superior padrão.
fonte
se não importa ter esses ids de elemento anexados ao url, você deve considerar dar uma olhada neste link:
Angular 2 - Links de âncora para elemento na página atual
fonte
Aqui está outra solução alternativa com referência à resposta JavierFuentes:
no script:
Isso permite ao usuário rolar diretamente para o elemento, se o usuário acessar diretamente a página com hashtag no url.
Mas, neste caso, subscrevi a rota Fragment in,
ngAfterViewChecked
masngAfterViewChecked()
é chamada continuamente a cadangDoCheck
e não permite que o usuário role de volta para o topo, entãorouteFragmentSubscription.unsubscribe
é chamada após um tempo limite de 0 milis após a exibição ser rolada para o elemento.Além disso, o
gotoHashtag
método é definido para rolar para o elemento quando o usuário clica especificamente na tag âncora.Atualizar:
Se url tiver querystrings,
[routerLink]="['self-route', id]"
na âncora não preservará as querystrings. Tentei seguir a solução alternativa para o mesmo:fonte
Este funciona para mim !! Este ng; para que ele ancore dinamicamente a tag, você precisa esperá-los renderizar
HTML:
Meu arquivo ts:
Não se esqueça de importar isso
ViewChildren
,QueryList
etc. e adicionar algum construtorActivatedRoute
!!fonte
Ao contrário de outras respostas, eu também adicionaria
focus()
junto comscrollIntoView()
. Também estou usando,setTimeout
pois salta para o topo de outra forma ao alterar a URL. Não sei qual foi a razão para isso, mas parecesetTimeout
que a solução alternativa.Origem:
Destino:
Texto datilografado:
fonte
Eu tive o mesmo problema. A solução: usando a porta View Scroller https://angular.io/api/common/ViewportScroller#scrolltoanchor
- código app-routing.module.ts:
- Componente HTML
- Código do componente:
fonte
Acabei de testar um plugin muito útil disponível em nmp - ngx-scroll-to , que funciona muito bem para mim. No entanto, ele foi projetado para Angular 4+, mas talvez alguém ache esta resposta útil.
fonte
Tentei a maioria dessas soluções, mas tive problemas ao sair e voltar com outro fragmento que não funcionaria, então fiz algo um pouco diferente que funciona 100% e me livrei do hash feio na URL.
tl; dr aqui está uma maneira melhor do que a que vi até agora.
fonte