Eu tenho um enorme conjunto de dados de vários milhares de linhas com cerca de 10 campos cada, cerca de 2 MB de dados. Eu preciso exibi-lo no navegador. A abordagem mais direta (buscar dados, inseri-los $scope
, deixarng-repeat=""
seu trabalho) funciona bem, mas congela o navegador por cerca de meio minuto quando começa a inserir nós no DOM. Como devo abordar esse problema?
Uma opção é anexar linhas para $scope
incrementalmente e aguardarngRepeat
concluir a inserção de um pedaço no DOM antes de passar para o próximo. Mas o AFAIK ngRepeat não reporta quando termina a "repetição", por isso será feio.
Outra opção é dividir os dados no servidor em páginas e buscá-los em várias solicitações, mas isso é ainda mais feio.
Examinei a documentação do Angular em busca de algo parecido ng-repeat="data in dataset" ng-repeat-steps="500"
, mas não encontrei nada. Eu sou bastante novo nas maneiras angulares, por isso é possível que eu esteja completamente errado. Quais são as melhores práticas para isso?
limitTo
para exibir apenas 20 itens:<p ng-repeat="data in dataset | limitTo:20">{{data}}</p>
mostra apenas 20 itens. Então você pode usar as páginas e mostrar os próximos 10 itens ou algo assim. :)Respostas:
Concordo com o @ AndreM96 que a melhor abordagem é exibir apenas uma quantidade limitada de linhas, UX mais rápida e melhor, isso pode ser feito com uma paginação ou com um rolagem infinita.
Rolagem infinita com Angular é realmente simples com filtro limitTo . Você só precisa definir o limite inicial e, quando o usuário solicitar mais dados (estou usando um botão para simplificar), você aumenta o limite.
Aqui está um JsBin .
Essa abordagem pode ser um problema para os telefones, porque geralmente eles ficam atrasados ao rolar muitos dados; portanto, nesse caso, acho que uma paginação se encaixa melhor.
Para isso, será necessário o filtro limitTo e também um filtro personalizado para definir o ponto inicial dos dados que estão sendo exibidos.
Aqui está um JSBin com uma paginação.
fonte
A abordagem mais quente - e sem dúvida a mais escalável - para superar esses desafios com grandes conjuntos de dados é incorporada pela abordagem da diretiva collectionRepeat da Ionic e por outras implementações semelhantes. Um termo chique para isso é 'seleção de oclusão' , mas você pode resumir como: não basta limitar a contagem de elementos DOM renderizados a um número paginado arbitrário (mas ainda alto) como 50, 100, 500 ... em vez disso , limite apenas a quantos elementos o usuário puder ver .
Se você fizer algo como o que é comumente conhecido como "rolagem infinita", estará reduzindo um pouco a contagem inicial do DOM, mas ela inchará rapidamente depois de algumas atualizações, porque todos esses novos elementos estão apenas na parte inferior. A rolagem chega a um rastreamento, porque a rolagem tem tudo a ver com a contagem de elementos. Não há nada de infinito nisso.
Visto que a
collectionRepeat
abordagem é usar apenas quantos elementos caberem na janela de exibição e depois reciclá-los . Como um elemento gira fora da vista, ele é desanexado da árvore de renderização, reabastecido com dados para um novo item na lista e, em seguida, reconectado à árvore de renderização na outra extremidade da lista. Esta é a maneira mais rápida conhecida pelo homem de obter e retirar novas informações do DOM, utilizando um conjunto limitado de elementos existentes, em vez do ciclo tradicional de criar / destruir ... criar / destruir. Usando essa abordagem, você pode realmente implementar uma rolagem infinita .Observe que você não precisa usar o Ionic para usar / hack / adaptar
collectionRepeat
, ou qualquer outra ferramenta semelhante. É por isso que eles chamam de código aberto. :-) (Dito isto, a equipe jônica está fazendo algumas coisas bastante engenhosas, dignas de sua atenção.)Há pelo menos um excelente exemplo de fazer algo muito semelhante no React. Somente em vez de reciclar os elementos com conteúdo atualizado, você simplesmente escolhe não renderizar nada na árvore que não esteja à vista. É rápido em 5000 itens, embora sua implementação muito simples de POC permita um pouco de cintilação ...
Também ... para repetir algumas das outras postagens, o uso
track by
é muito útil, mesmo com conjuntos de dados menores. Considere obrigatório.fonte
Eu recomendo ver isso:
Otimizando o AngularJS: 1200ms a 35ms
eles fizeram uma nova diretiva otimizando o ng-repeat em 4 partes:
o projeto está aqui no github:
Uso:
1- inclua esses arquivos no seu aplicativo de página única:
2- adicione dependência do módulo:
3- substituir ng-repeat
Desfrutar!
fonte
sly-repeat
, mas nada me ajudou os resultados ainda são lentos e defasagens navegador também recebendo violações[Violation] 'setTimeout' handler took 54ms
,[Violation] 'scroll' handler took 1298ms
Além de todas as dicas acima, como rastrear e loops menores, este também me ajudou muito
esse trecho de código imprimiria o nome depois de carregado e deixaria de observá-lo depois disso. Da mesma forma, para repetições ng, poderia ser usado como
no entanto, ele funciona apenas para o AngularJS versão 1.3 e superior. Em http://www.befundoo.com/blog/optimizing-ng-repeat-in-angularjs/
fonte
::
repetir e também a expressão? Os documentos dizem o contrário, mas não tenho certeza de como testar se isso está funcionando. docs.angularjs.org/guide/expressionVocê pode usar "rastrear por" para aumentar o desempenho:
Mais rápido que:
ref: https://www.airpair.com/angularjs/posts/angularjs-performance-large-applications
fonte
Se todas as suas linhas tiverem altura igual, você definitivamente deve dar uma olhada na ng-repeat virtualizada: http://kamilkp.github.io/angular-vs-repeat/
Esta demonstração parece muito promissora (e suporta rolagem inercial)
fonte
Regra No.1: Nunca deixe o usuário esperar por nada.
Isso significa que uma página em crescimento que precisa de 10 segundos aparece muito mais rápido do que esperar 3 segundos antes de uma tela em branco e obter tudo de uma vez.
Então, ao invés de fazer a página rápido, apenas deixe a página aparecer para ser rápido, mesmo que o resultado final é mais lento:
O código acima permite que a lista esteja crescendo linha por linha e é sempre mais lenta que a renderização de uma só vez. Mas para o usuário parece ser mais rápido.
fonte
A rolagem virtual é outra maneira de melhorar o desempenho da rolagem ao lidar com listas enormes e grandes conjuntos de dados.
Uma maneira de implementar isso é usar o Material Angular,
md-virtual-repeat
como é demonstrado nesta demonstração com 50.000 itensRetirado diretamente da documentação da repetição virtual:
fonte
Outra versão @Steffomio
Em vez de adicionar cada item individualmente, podemos adicionar itens por partes.
fonte
Às vezes, o que aconteceu, você obtém os dados do servidor (ou back-end) em poucos ms (por exemplo, estou assumindo 100ms), mas leva mais tempo para ser exibido em nossa página da web (digamos que está levando 900ms para exibição).
Então, o que está acontecendo aqui são 800ms. É preciso apenas para renderizar a página da web.
O que fiz no meu aplicativo da web é que usei a paginação (ou você pode usar a rolagem infinita também) para exibir a lista de dados. Digamos que estou mostrando 50 dados / página.
Portanto, não carregarei renderizar todos os dados de uma só vez, apenas 50 dados que estou carregando inicialmente, o que leva apenas 50ms (suponho aqui).
portanto, o tempo total aqui diminuiu de 900 ms para 150 ms, uma vez que o usuário solicita a próxima página, exibe os próximos 50 dados e assim por diante.
Espero que isso ajude você a melhorar o desempenho. Muito bem sucedida
fonte
que carrega dados quando chega à parte inferior da página e remove metade dos dados carregados anteriormente e quando chega ao topo da div novamente, os dados anteriores (dependendo do número da página) serão carregados removendo a metade dos dados atuais So on DOM por vez, apenas dados limitados estão presentes, o que pode levar a um melhor desempenho, em vez de renderizar dados inteiros em carga.
CÓDIGO HTML:
CÓDIGO angular:
Demonstração com diretiva
Dependendo da altura da divisão, ele carrega os dados e, após a rolagem, novos dados serão anexados e os dados anteriores serão removidos.
Código HTML:
Código angular:
Demonstração com grade da interface do usuário com demonstração de rolagem infinita
fonte
para grandes conjuntos de dados e vários valores suspensos, é melhor usar
ng-options
do que usarng-repeat
.ng-repeat
é lento porque faz um loop sobre todos os valores futuros, masng-options
simplesmente é exibido na opção de seleção.muito, muito mais rápido que
fonte