Isso acabou sendo uma condição de corrida desagradável entre o “sentinela” que usamos para detectar quando precisamos acionar a ação “carregar mais” e a renderização das linhas no diretório de usuários ![]()
O Problema
Quando havia pelo menos 50 usuários, a página /u (diretório de usuários) acionava loadMore imediatamente no primeiro carregamento, antes que o usuário pudesse rolar para baixo. Isso causou o carregamento automático de uma segunda página de resultados indesejada.
Causa Raiz
Condição de corrida de tempo durante o carregamento inicial da página:
- Usuário navega para
/u controllers/userscomeça a carregar dados (isLoading: true)- O template renderiza com
ConditionalLoadingSpinnermostrando o spinner - Os dados chegam,
isLoadingse tornafalse - O spinner é ocultado,
DirectoryTablecomeça a renderizar 50 usuários - O sentinela LoadMore é inserido no DOM
- IntersectionObserver é criado e começa a observar imediatamente
- Neste momento, a tabela ainda está calculando o layout/expandindo para a altura total
- O sentinela fica brevemente visível na viewport (~292px do topo) antes da tabela expandir
- O observador detecta a interseção → aciona
loadMore
- A tabela termina de expandir para a altura total (~3689px)
- O sentinela se move para a posição correta (~3959px, abaixo da viewport)
O observador foi “muito ansioso” - ele começou a observar antes que o conteúdo terminasse seu layout, capturando o sentinela durante o breve momento em que a tabela ainda não havia atingido sua altura final.
A Correção
Atrasar a criação do observador até que o conteúdo esteja pronto:
Adicionado um parâmetro @isLoading a LoadMore que impede a criação do IntersectionObserver quando o conteúdo ainda está carregando.
Como Funciona Agora
Carregamento da página → isLoading=true → Modifier pula a criação do observador
↓
Carregamento dos dados → isLoading=false → Modifier executa novamente, cria o observador
↓
Tabela totalmente expandida → Sentinela na posição correta (abaixo da viewport)
↓
Usuário rola para baixo → Sentinela entra na viewport → loadMore é acionado ✓