Sem problemas de estados de link ativos no Meteor

Eu originalmente tentei alguns métodos em que você registra um assistente de guiador global para definir estados ativos em links ( este, principalmente ), mas achei um pouco repetitivo.

Portanto, o que faço agora é ligar para o callback de renderização do modelo de layout do aplicativo.

Estou usando o Iron Router para roteamento e ele está configurado para usar um layout simples.

Sempre que esse layout é renderizado I, procuro por quaisquer links que estão ativos e removo essa classe, então onde o atributo href corresponde ao caminho atual, eu adiciono uma classe ativa.

Para minha navegação (usando uma barra de navegação de bootstrap), faço algo semelhante, mas só quero comparar com o radical do url para que ‘Postagens’ ainda esteja ativo quando estivermos olhando para ‘/ posts / hello-world’ etc.

Template.layout.rendered = ->
setActiveLinks
()

setActiveLinks
= _.debounce ->
path
= location.pathname
$
("a[href].active").removeClass('active')
$
("a[href='#{path}']").addClass('active')
# deal with top level nav
stem
= path.split('/')[1]
$
('.navbar-nav > li.active').removeClass('active')
$
(".navbar-nav a[href^='/#{stem}']").parent().addClass('active')
,250, true

Eu tentei primeiro colocar esse recurso em um filtro global para o Iron Router, mas descobri que às vezes meus links não eram ativados. Isso acabou sendo o resultado de meu tempalte naval sendo refeito por alguns outros elementos reativos.

O retorno de chamada de renderização para o modelo de layout é acionado sempre que algo na página muda, então fez sentido colocar o manipulador de estado do link lá.

Por último, o retorno de chamada de renderização no modelo de layout estava sendo muito chamado! Então eu usei _.debounce para acalmar um pouco as coisas. Uma espera de 250 ms funciona para mim, mas talvez seja necessário ajustá-la.