Estou usando ng-repeat com meu código e tenho um número de caixa de texto com base em ng-repeat. Eu quero alinhar a caixa de texto com três colunas.
esse é o meu código
<div class="control-group" ng-repeat="oneExt in configAddr.ext">
{{$index+1}}.
<input type="text" name="macAdr{{$index+1}}"
id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>
Respostas:
A abordagem mais confiável e tecnicamente correta é transformar os dados no controlador. Aqui está uma função e uso simples de um pedaço.
Então, sua visão seria assim:
Se você tiver alguma entrada dentro do
ng-repeat
, provavelmente desejará desmarcar / juntar as matrizes à medida que os dados são modificados ou enviados. Veja como isso ficaria em um$watch
, para que os dados estejam sempre disponíveis no formato mesclado original:Muitas pessoas preferem fazer isso na visualização com um filtro. Isso é possível, mas só deve ser usado para fins de exibição! Se você adicionar entradas nessa exibição filtrada, isso causará problemas que podem ser resolvidos, mas não são bonitos ou confiáveis .
O problema com esse filtro é que ele retorna novas matrizes aninhadas a cada vez. Angular está observando o valor de retorno do filtro. Na primeira vez em que o filtro é executado, o Angular conhece o valor e o executa novamente para garantir a alteração. Se os dois valores forem iguais, o ciclo será encerrado. Caso contrário, o filtro será acionado repetidamente até que sejam iguais, ou o Angular perceberá que um loop de digestão infinito está ocorrendo e será desligado. Como novas matrizes / objetos aninhados não foram rastreados anteriormente pelo Angular, ele sempre vê o valor de retorno diferente do anterior. Para corrigir esses filtros "instáveis", você deve agrupar o filtro em uma
memoize
função.lodash
tem umamemoize
função e a versão mais recente do lodash também inclui umachunk
função, para que possamos criar esse filtro de maneira muito simples usandonpm
módulos e compilando o script combrowserify
ouwebpack
.Lembre-se: somente exibição! Filtre no controlador se você estiver usando entradas!
Instale o lodash:
Crie o filtro:
E aqui está uma amostra com este filtro:
Encomende itens verticalmente
Em relação às colunas verticais (listar de cima para baixo) em vez de horizontais (da esquerda para a direita), a implementação exata depende da semântica desejada. Listas que se dividem desigualmente podem ser distribuídas de maneiras diferentes. Aqui está uma maneira:
No entanto, a maneira mais direta e simples de obter colunas é usar colunas CSS :
fonte
a b c
segunda linhad e f
. Posso exibira b
na primeira colunac d
na segunda ee f
na terceira coluna? Graças[].concat.call([], val)
. Você deve considerar o queapply
faz.val
é uma matriz de matrizes e queremos passar cada uma dessas matrizes como argumentos paraconcat
. Eu acho que você está se concentrando no contexto de[]
, que não é o ponto aqui. O que queremos é[].concat(val[1], val[2], val[3], etc)
, por isso precisamosapply([], val)
[]
vs[[]]
e[{}]
. A matriz / objeto aninhado faz com que o Angular veja um resultado diferente a cadafilter
e continua repetindo, procurando que o resultado permaneça o mesmo (estabilizar).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
A verificação profunda significa a stringização e a comparação de strings, o que é arriscado porque um objeto pode não ser passível de streabilidade ou a verificação recursiva de cada propriedade individualmente. Acho que a Angular poderia implementar isso para filtros, mas tenho certeza de que há uma boa razão para que eles não o tenham feito. Provavelmente porque eles pretendiam principalmente filtros para modificação simples de um conjunto de dados, não uma revisão completa com alterações na estrutura.Esta solução é muito simples:
JSON:
HTML:
DEMO em FIDDLE
fonte
ng-switch-when="0"
em uma div externa uma vez em vez de em todos os 3 itens.Uma solução limpa e adaptável que não requer manipulação de dados :
O HTML:
O CSS:
O JavaScript:
Essa é uma solução simples para renderizar dados em linhas e colunas dinamicamente, sem a necessidade de manipular a matriz de dados que você está tentando exibir. Além disso, se você tentar redimensionar a janela do navegador, poderá ver a grade se adaptar dinamicamente ao tamanho da tela / div.
(Também adicionei um sufixo {{index}} ao seu ID, pois ng-repeat tentará criar vários elementos com o mesmo ID, se você não o fizer.
Um exemplo de trabalho semelhante
fonte
<span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>
Isso está dentro do `modal-body '.A resposta da m59 é muito boa. A única coisa que eu não gosto é que ele usa
div
s para o que poderia ser potencialmente dados para uma tabela.Portanto, em conjunto com o filtro do m59 (responda em algum lugar acima), veja como mostrá-lo em uma tabela.
fonte
A seguir, é uma maneira mais simples:
A resposta de Cumulo Nimbus é útil para mim, mas eu quero essa grade envolvida por uma div que possa mostrar a barra de rolagem quando a lista for muito longa.
Para conseguir isso, adicionei
style="height:200px; overflow:auto"
uma div ao redor da tabela que faz com que ela apareça como uma única coluna.Agora funciona para um comprimento de matriz de um.
fonte
ng-hide="$index%2!==0"
Eu tenho uma função e a armazenei em um serviço para que eu possa usá-la em todo o meu aplicativo:
Serviço:
});
Controlador:
Marcação:
fonte
Minha abordagem foi uma mistura de coisas.
Meu objetivo era ter uma grade adaptada ao tamanho da tela. Eu queria 3 colunas para
lg
, 2 colunas parasm
emd
e 1 coluna paraxs
.Primeiro, criei a seguinte função de escopo, usando o
$window
serviço angular :Então, usei a classe proposta por @Cumulo Nimbus:
Na div que contém o
ng-repeat
, adicionei aresizable
diretiva, conforme explicado nesta página , para que toda vez que a janela seja redimensionada, o$window
serviço angular seja atualizado com os novos valores.Por fim, na div repetida, tenho:
Por favor, deixe-me saber quaisquer falhas nessa abordagem.
Espero que possa ser útil.
fonte
Um truque simples com CSS "clearfix" recomendado pelo Bootstrap:
Muitas vantagens: Eficiente, rápido, usando as recomendações do Boostrap, evitando possíveis problemas de digestão e não alterando o modelo Angular.
fonte
Este exemplo produz um repetidor aninhado em que os dados externos incluem uma matriz interna que eu queria listar em duas colunas. O conceito seria válido para três ou mais colunas.
Na coluna interna, repito a "linha" até que o limite seja atingido. O limite é determinado dividindo o comprimento da matriz de itens pelo número de colunas desejadas, neste caso por duas. O método de divisão fica no controlador e recebe o comprimento atual da matriz como parâmetro. A função de fatia do JavaScript (0, array.length / columnCount) aplicou o limite ao repetidor.
O segundo repetidor da coluna é chamado e repete a fatia (array.length / columnCount, array.length) que produz a segunda metade do array na coluna dois.
Espero que isso ajude a olhar para a solução de outra maneira. (PS, este é o meu primeiro post aqui! :-))
fonte
Eu conserto sem .row
e css
fonte
Aqui está uma maneira fácil e fácil de fazer isso. É mais manual e acaba com uma marcação confusa. Eu não recomendo isso, mas há situações em que isso pode ser útil.
Aqui está um link de violino http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Essa configuração requer que usemos um pouco de matemática na marcação: /, portanto, você precisará injetar o matemática adicionando esta linha:
$scope.Math = Math;
fonte
Todas essas respostas parecem maciças demais.
De longe, o método mais simples seria configurar as divs de entrada em um bootstrap de coluna col-md-4; o bootstrap o formatará automaticamente em 3 colunas devido à natureza de 12 colunas do bootstrap:
fonte
fonte
Baseando-se na resposta muito boa do m59. Eu descobri que as entradas do modelo seriam borradas se elas mudassem, então você só pode alterar um caractere de cada vez. Este é um novo para listas de objetos para quem precisa:
E este seria o uso:
fonte
Eu sou novo no bootstrap e no angularjs, mas isso também pode gerar Array por 4 itens como um grupo, o resultado será quase três colunas. Este truque usa o princípio de linha de interrupção de inicialização.
fonte
Agora, o Lodash possui um método chunk que eu pessoalmente uso: https://lodash.com/docs#chunk
Com base nisso, o código do controlador pode se parecer com o seguinte:
Ver código:
fonte
Outra maneira é definida
width:33.33%; float:left
como uma div wrapper como esta:fonte
Eu me encontrei em um caso semelhante, desejando gerar grupos de exibição de 3 colunas cada. No entanto, embora eu estivesse usando o bootstrap, estava tentando separar esses grupos em diferentes divs pai. Eu também queria fazer algo genericamente útil.
Eu me aproximei com 2
ng-repeat
como abaixo:Isso facilita muito a mudança para um número diferente de colunas e separadas em várias divs pai.
fonte
Caso alguém queira um Angular 7 (e uma versão superior), aqui está um exemplo que eu usei em um dos meus aplicativos:
HTML:
.TS FILE
Esta é uma solução incrível para criar dinamicamente novas colunas / linhas, dependendo da quantidade de itens que você itera no banco de dados. Obrigado!
fonte
isso responde à pergunta original, que é como obter 1,2,3 em uma coluna. Pergunta feita por kuppu Feb 8 '14 às 13:47
código angularjs:
Exibir código (nota: usando o bootstrap 3):
fonte
Esse código ajudará a alinhar os elementos com três colunas no modo lg e md, duas colunas no modo sm e a coluna única no modo xs
fonte