Atualmente, estou usando este trecho de código para renderizar uma lista:
<ul ng-cloak>
<div ng-repeat="n in list">
<li><a href="{{ n[1] }}">{{ n[0] }}</a></li>
<li class="divider"></i>
</div>
<li>Additional item</li>
</ul>
No entanto, o <div>
elemento está causando alguns defeitos de renderização muito pequenos em alguns navegadores. Gostaria de saber se existe uma maneira de repetir o ng sem o contêiner div ou algum método alternativo para obter o mesmo efeito.
javascript
css
html
angularjs
nehz
fonte
fonte
htmlAppend
diretiva?Respostas:
Como Andy Joslin disse, eles estavam trabalhando em repetições de ng com base em comentários, mas aparentemente havia muitos problemas com o navegador . Felizmente, o AngularJS 1.2 adiciona suporte integrado para repetição sem adicionar elementos filho com as novas diretivas
ng-repeat-start
eng-repeat-end
.Aqui está um pequeno exemplo para adicionar paginação Bootstrap :
Um exemplo completo de trabalho pode ser encontrado aqui .
John Lindquist também tem um vídeo tutorial sobre isso em sua excelente página egghead.io .
fonte
ng-repeat-start/end
mas este é um exemplo confuso e o caso de uso errado para ele. Um padrãong-repeat
deve ser usado aqui, pois seu código renderiza um vazio extrali
para cada item. Você provavelmente deve mencionar isso em sua postagem.ng-repeat-start
. Vou adicionar adivider
classe html à minha resposta para ser mais claro.ng-repeat-start
eng-repeat-end
são um pouco confusos. A documentação Angular ajuda: https://docs.angularjs.org/api/ng/directive/ngRepeat#special-repeat-start-and-end-pointsSintaxe de ligação sem contêiner KnockoutJS
Tenha um segundo: KnockoutJS oferece uma opção extremamente conveniente de usar uma sintaxe de vinculação sem contêiner para sua
foreach
vinculação, conforme discutido na Nota 4 daforeach
documentação de vinculação. http://knockoutjs.com/documentation/foreach-binding.htmlConforme ilustra o exemplo de documentação do Knockout, você pode escrever sua vinculação em KnockoutJS assim:
Eu acho que é lamentável que o AngularJS não ofereça esse tipo de sintaxe.
Angular's
ng-repeat-start
eng-repeat-end
Na maneira do AngularJS de resolver
ng-repeat
problemas, os exemplos que encontrei são do tipo que jmagnusson postou em sua resposta (útil).Meu pensamento original ao ver essa sintaxe é: realmente? Por que o Angular está forçando toda essa marcação extra com a qual não quero fazer nada e que é muito mais fácil no Knockout? Mas então o comentário de hitautodestruct na resposta de jmagnusson começou a me fazer pensar: o que está sendo gerado com ng-repeat-start e ng-repeat-end em tags separadas?
Uma maneira mais limpa de usar
ng-repeat-start
eng-repeat-end
Ao investigar a afirmação de hitautodestruct, adicionar
ng-repeat-end
uma tag separada é exatamente o que eu não gostaria de fazer na maioria dos casos, porque gera elementos totalmente inúteis: neste caso,<li>
itens sem nada neles. A lista paginada do Bootstrap 3 estiliza os itens da lista para que pareça que você não gerou nenhum item supérfluo, mas quando você inspeciona o html gerado, eles estão lá.Felizmente , você não precisa fazer muito para ter uma solução mais limpa e uma quantidade menor de html: basta colocar a
ng-repeat-end
declaração na mesma tag html que contém ong-repeat-start
.Isso dá 3 vantagens:
ng-repeat
não será gerada, dando a você a mesma vantagem que a vinculação sem recipiente do Knockout oferece a esse respeitoMas ainda há uma maneira mais limpa
Depois de revisar os comentários no github sobre este problema para Angular, https://github.com/angular/angular.js/issues/1891 ,
você não precisa usar
ng-repeat-start
eng-repeat-end
obter as mesmas vantagens. Em vez disso, bifurcando novamente o exemplo de jmagnusson, podemos simplesmente ir:Então, quando usar
ng-repeat-start
eng-repeat-end
? De acordo com a documentação angular , paraChega de conversa, mostre alguns exemplos!
Justo; este jsbin percorre cinco exemplos do que acontece quando você faz e quando não usa
ng-repeat-end
na mesma tag.http://jsbin.com/eXaPibI/1/
fonte
ng-repeat-start
eng-repeat-end
ao mesmo elemento é totalmente inútil quando você pode usar o padrão do angularng-repeat
e terminar com ele.ng-repeat
ou encontrar uma alternativa para o uso do OPng-repeat
que elimine odiv
artefato no HTML. Sua resposta não faz isso, pois não há como usá-la para os doisli
elementos da pergunta. Se eu estiver errado aqui, forneça uma marcação de amostra que adapte o código do OP para eliminar odiv
elemento.li
item divisor seja gerado, que é o extra queli
você vê em seu jsbin.ngRepeat pode não ser suficiente, no entanto, você pode combinar isso com uma diretiva personalizada. Você pode delegar a tarefa de adicionar itens divisores ao código se não se importar um pouco com jQuery.
Uma diretiva tão simples realmente não precisa de um valor de atributo, mas pode dar a você muitas possibilidades, como adicionar condicionalmente um divisor de acordo com o índice, comprimento, etc. ou algo completamente diferente.
fonte
Recentemente, tive o mesmo problema em que tive que repetir uma coleção arbitrária de extensões e imagens - ter um elemento ao redor deles não era uma opção - há uma solução simples, no entanto, crie uma diretiva "nula":
Você pode então usar uma repetição nesse elemento, onde element.url aponta para o modelo desse elemento:
Isso repetirá qualquer número de modelos diferentes, sem nenhum contêiner em torno deles
Nota: hmm eu poderia ter jurado às cegas, isso removeu o elemento di-null durante a renderização, mas verificá-lo novamente ... ainda resolveu meus problemas de layout ... curioso e curioso ...
fonte
replace
está obsoleto desde 2.0.Há uma restrição de diretiva de comentário, mas ngRepeat não a suporta (uma vez que precisa de um elemento para repetir).
Acho que vi a equipe angular dizer que trabalharia com repetições de comentários, mas não tenho certeza. Você deve abrir um problema para ele no repo. http://github.com/angular/angular.js
fonte
Não existe uma maneira mágica do Angular de fazer isso; para o seu caso, você pode fazer isso, para obter um HTML válido, se estiver usando o Bootstrap. Então você obterá o mesmo efeito que adicionar o li.divider
Crie uma classe:
Agora mude seu código para este:
fonte
para uma solução que realmente funcione
html
adicione uma diretiva angular.js
para uma breve explicação,
ng-repeat se liga ao
<remove>
elemento e faz um loop como deveria, e como usamos ng-repeat-start / ng-repeat-end ele faz um loop em um bloco de html, não apenas em um elemento.então a diretiva de remoção personalizada coloca os
<remove>
elementos de início e fim com<!--removed element-->
fonte
replaceWith(...)
resultados de teste em um nó de texto, não um comentário. Eu encontrei apenas usandoelement.remove()
obras.