come dividere i dati ng-repeat con tre colonne usando bootstrap


122

Sto usando ng-repeat con il mio codice ho un numero 'n' di caselle di testo basate su ng-repeat. Voglio allineare la casella di testo con tre colonne.

questo è il mio codice

<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>

1
quindi supponendo che tu abbia nove (9) vuoi 1,2,3 in una riga o in una colonna?
Gabriele Petrioli

Risposte:


254

L'approccio più affidabile e tecnicamente corretto è trasformare i dati nel controller. Ecco una semplice funzione e utilizzo di blocchi.

function chunk(arr, size) {
  var newArr = [];
  for (var i=0; i<arr.length; i+=size) {
    newArr.push(arr.slice(i, i+size));
  }
  return newArr;
}

$scope.chunkedData = chunk(myData, 3);

Quindi la tua vista sarebbe simile a questa:

<div class="row" ng-repeat="rows in chunkedData">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

Se hai degli input all'interno di ng-repeat, probabilmente vorrai sbloccare / ricongiungere gli array man mano che i dati vengono modificati o al momento dell'invio. Ecco come apparirebbe in a $watch, in modo che i dati siano sempre disponibili nel formato originale e unito:

$scope.$watch('chunkedData', function(val) {
  $scope.data = [].concat.apply([], val);
}, true); // deep watch

Molte persone preferiscono eseguire questa operazione nella vista con un filtro. Questo è possibile, ma dovrebbe essere utilizzato solo per scopi di visualizzazione! Se aggiungi input all'interno di questa visualizzazione filtrata, causerà problemi che possono essere risolti, ma non sono belli o affidabili .

Il problema con questo filtro è che restituisce ogni volta nuovi array nidificati. Angular sta guardando il valore di ritorno dal filtro. La prima volta che il filtro viene eseguito, Angular conosce il valore, quindi lo esegue di nuovo per assicurarsi che sia stato modificato. Se entrambi i valori sono uguali, il ciclo è terminato. In caso contrario, il filtro si attiverà ancora e ancora fino a quando non sono uguali, oppure Angular si rende conto che si sta verificando un ciclo digest infinito e si spegne. Poiché i nuovi array / oggetti annidati non erano stati precedentemente tracciati da Angular, vede sempre il valore restituito come diverso dal precedente. Per correggere questi filtri "instabili", è necessario racchiudere il filtro in una memoizefunzione. lodashha una memoizefunzione e l'ultima versione di lodash include anche una chunkfunzione, quindi possiamo creare questo filtro molto semplicemente usandonpmmoduli e compilando lo script con browserifyo webpack.

Ricorda: solo display! Filtra nel controller se stai usando gli input!

Installa lodash:

npm install lodash-node

Crea il filtro:

var chunk = require('lodash-node/modern/array/chunk');
var memoize = require('lodash-node/modern/function/memoize');

angular.module('myModule', [])
.filter('chunk', function() {
  return memoize(chunk);
});

Ed ecco un esempio con questo filtro:

<div ng-repeat="row in ['a','b','c','d','e','f'] | chunk:3">
  <div class="column" ng-repeat="item in row">
    {{($parent.$index*row.length)+$index+1}}. {{item}}
  </div>
</div>

Ordina gli articoli verticalmente

1  4
2  5
3  6

Per quanto riguarda le colonne verticali (elenco dall'alto in basso) piuttosto che orizzontali (da sinistra a destra), l'implementazione esatta dipende dalla semantica desiderata. Gli elenchi che si dividono in modo non uniforme possono essere distribuiti in modi diversi. Ecco un modo:

<div ng-repeat="row in columns">
  <div class="column" ng-repeat="item in row">
    {{item}}
  </div>
</div>
var data = ['a','b','c','d','e','f','g'];
$scope.columns = columnize(data, 3);
function columnize(input, cols) {
  var arr = [];
  for(i = 0; i < input.length; i++) {
    var colIdx = i % cols;
    arr[colIdx] = arr[colIdx] || [];
    arr[colIdx].push(input[i]);
  }
  return arr;
}

Tuttavia, il modo più diretto e semplicemente semplice per ottenere colonne è utilizzare le colonne CSS :

.columns {
  columns: 3;
}
<div class="columns">
  <div ng-repeat="item in ['a','b','c','d','e','f','g']">
    {{item}}
  </div>
</div>

Grazie per l'aiuto. Ma l'uso del carosello con ui-chart in angolare non può disegnare il grafico bt carousel funziona bene. il mio codice è <carousel interval = "myInterval"> <slide ng-repeat = "milestone in mileStone | split: 4" active = "slide.active"> <div class = "col-md-3" ng-repeat = " milestone1 in milestone "> <div style =" text-align: center; "> <div ui-chart =" data "chart-options =" ​​chartOptions "> </div> </div> </div> </ slide > </carousel> E ho inizializzato la mia variabile di ambito come dati JSON cardine.
kuppu

1
@ m59 In questo momento questa funzione mostra i dati nella prima riga nella a b cseconda riga d e f. Posso visualizzare a b nella prima colonna c dnella seconda colonna e e fnella terza colonna? Grazie

1
@ Ifch0o1 Avresti ragione se così fosse [].concat.call([], val). Devi considerare cosa applyfa. valè un array di array e vogliamo passare ognuno di questi array al suo interno come argomenti a concat. Penso che ti stia concentrando sul contesto di [], che non è il punto qui. Quello che vogliamo è [].concat(val[1], val[2], val[3], etc), quindi abbiamo bisogno diapply([], val)
m59

1
@bahadir ho aggiornato la risposta per essere più chiaro. Controlla cosa succede se crei un filtro che restituisce solo []vs [[]]e [{}]. L'array / oggetto annidato fa in modo che Angular veda un risultato diverso su ogni filter, e continua a ripetere cercando che il risultato rimanga lo stesso (stabilizzare).
m59

1
Stai davvero inviando spam ai commenti :) Provalo tu stesso. var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);Il controllo approfondito significa stringere e confrontare stringhe, il che è rischioso perché un oggetto potrebbe non essere stringibile, o controllare ricorsivamente ogni proprietà individualmente. Penso che Angular potrebbe implementarlo per i filtri, ma sono sicuro che ci sono buone ragioni per non farlo. Probabilmente perché si trattava principalmente di filtri per la semplice modifica di un set di dati, non per una revisione completa con modifiche alla struttura.
m59

64

Questa soluzione è molto semplice:

JSON:

[{id:"1",name:"testA"},{id:"2",name:"test B"},{id:"3",name:"test C"},{id:"4",name:"test D"},{id:"5",name:"test E"}]

HTML:

<div ng-controller="MyCtrl">
  <table>
    <tr ng-repeat="item in items" ng-switch on="$index % 3">
      <td ng-switch-when="0">
        {{items[$index].id}} {{items[$index].name}}
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+1]">
          {{items[$index+1].id}} {{items[$index+1].name}}
        </span>
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+2]">    
          {{items[$index+2].id}} {{items[$index+2].name}}
        </span>
      </td>
    </tr>
  </table>
</div>

DEMO in FIDDLE

inserisci qui la descrizione dell'immagine


3
Migliore risposta! E fai ciò che è necessario con le direttive native! Congratz!
Renan Franca

1
Questa soluzione funziona, ma per quanto riguarda le migliori pratiche, probabilmente non dovresti usare le tabelle per definire il layout nel tuo markup :)
Dave Cooper

2
Come menzionato da @DaveCooper, ecco un layout alternativo senza tabelle: plnkr.co/edit/81oj8mHaNyfQpCmRBWO4?p=preview . Considera le tabelle per i dati tabulati, ma per il resto questo è un layout migliore per i dispositivi mobili e le dimensioni dello schermo variabili.
Zymotik

1
Questa è di gran lunga la soluzione migliore. Ci vuole tempo per trovare tutte le stranezze quando si utilizza un nuovo framework, ma ng-switch è una manna dal cielo
Zoran

Se stai scegliendo div invece di un tavolo, potresti posizionarlo ng-switch-when="0"su un div esterno una volta invece che su tutti e 3 gli elementi.
Hans Wouters

19

Una soluzione pulita e adattabile che non richiede la manipolazione dei dati :

L'HTML:

<div class="control-group" class="label"
    ng-repeat="oneExt in configAddr.ext"
    ng-class="{'new-row': startNewRow($index, columnBreak) }">
    {{$index+1}}. 
    <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress{{$index}}" ng-model="oneExt.newValue" />
</div>

Il CSS:

.label {
    float: left;
    text-align: left;
}
.new-row {
    clear: left;
}

Il JavaScript:

$scope.columnBreak = 3; //Max number of colunms
$scope.startNewRow = function (index, count) {
    return ((index) % count) === 0;
};

Questa è una soluzione semplice per il rendering dinamico dei dati in righe e colonne senza la necessità di manipolare l'array di dati che si sta tentando di visualizzare. Inoltre se provi a ridimensionare la finestra del browser puoi vedere che la griglia si adatta dinamicamente alle dimensioni dello schermo / div.

(Ho anche aggiunto un suffisso {{$ index}} al tuo id poiché ng-repeat proverà a creare più elementi con lo stesso id se non lo fai.)

Un esempio di lavoro simile


1
Credo che l'OP volesse il markup per le righe / colonne di Twitter Bootstrap, ma questo potrebbe essere utile a qualcuno. Tuttavia, è necessario inserire il codice e la spiegazione nella risposta. Solo le risposte al collegamento verranno rimosse.
m59

@ m59 Risposta aggiornata. Grazie per il suggerimento
Cumulo Nimbus

1
Big +1 per non richiede la manipolazione dei dati . Questo ha funzionato perfettamente per le mie esigenze di voler separare i dati in un intervallo usando ng-repeat in 2 colonne in modo che il mio modale Bootstrap non fosse così lungo! Sono rimasto sorpreso di quanto fosse semplice da implementare! <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>Questo è all'interno di "modal-body".
Christine268

15

La risposta di m59 è abbastanza buona. L'unica cosa che non mi piace è che usa divs per quelli che potrebbero essere dati per una tabella.

Quindi, in combinazione con il filtro di m59 (risposta da qualche parte sopra), ecco come visualizzarlo in una tabella.

<table>
    <tr class="" ng-repeat="rows in foos | chunk:2">
        <td ng-repeat="item in rows">{{item}}</td>
    </tr>
</table>

7

Di seguito è riportato un modo più semplice:

<table>
    <tr ng-repeat="item in lists" ng-hide="$index%2!==0">
        <td>
            <label>{{ lists[$index].name}}</label>
        </td>
        <td ng-hide="!lists[$index+1]">
            <label>{{ lists[$index+1].name}}</label>
        </td>
    </tr>
</table>

La risposta di Cumulo Nimbus è utile per me, ma voglio che questa griglia sia racchiusa da un div che può mostrare la barra di scorrimento quando l'elenco è troppo lungo.

Per ottenere ciò ho aggiunto style="height:200px; overflow:auto"un div attorno alla tabella che lo fa apparire come una singola colonna.

Ora funziona per una lunghezza dell'array di uno.


quando c'è un solo elemento nell'array, non visualizzerà la prima riga stessa. per correggere questa modifica, il ng-hide="$index%2!==0"
Anuj Pandey

4

Ho una funzione e l'ho memorizzata in un servizio in modo da poterla utilizzare in tutta la mia app:

Servizio:

app.service('SplitArrayService', function () {
return {
    SplitArray: function (array, columns) {
        if (array.length <= columns) {
            return [array];
        };

        var rowsNum = Math.ceil(array.length / columns);

        var rowsArray = new Array(rowsNum);

        for (var i = 0; i < rowsNum; i++) {
            var columnsArray = new Array(columns);
            for (j = 0; j < columns; j++) {
                var index = i * columns + j;

                if (index < array.length) {
                    columnsArray[j] = array[index];
                } else {
                    break;
                }
            }
            rowsArray[i] = columnsArray;
        }
        return rowsArray;
    }
}

});

controller:

$scope.rows   = SplitArrayService.SplitArray($scope.images, 3); //im splitting an array of images into 3 columns

markup:

 <div class="col-sm-12" ng-repeat="row in imageRows">
     <div class="col-sm-4" ng-repeat="image in row">
         <img class="img-responsive" ng-src="{{image.src}}">
     </div>
 </div>

Anche se questo è interessante, non aiuta quando si usano altri filtri come orderBy o filter.
Robbie Smith

2

Il mio approccio era un misto di cose.

Il mio obiettivo era quello di avere una griglia che si adattasse alle dimensioni dello schermo. Volevo 3 colonne per lg, 2 colonne per sme mde 1 colonna perxs .

Innanzitutto, ho creato la seguente funzione di ambito, utilizzando il $windowservizio angolare :

$scope.findColNumberPerRow = function() {
    var nCols;
    var width = $window.innerWidth;

    if (width < 768) {
        // xs
        nCols = 1;
    }
    else if(width >= 768 && width < 1200) {
         // sm and md
         nCols = 2
    } else if (width >= 1200) {
        // lg
        nCols = 3;
    }
    return nCols;
};

Quindi, ho usato la classe proposta da @Cumulo Nimbus:

.new-row {
    clear: left;
}

Nel div contenente il ng-repeat, ho aggiunto la resizabledirettiva, come spiegato in questa pagina , in modo che ad ogni ridimensionamento della finestra, il $windowservizio angolare venga aggiornato con i nuovi valori.

In definitiva, nel div ripetuto ho:

ng-repeat="user in users" ng-class="{'new-row': ($index % findColNumberPerRow() === 0) }"

Per favore, fammi sapere eventuali difetti in questo approccio.

Spero possa essere utile.


2

Un semplice trucco con CSS "clearfix" consigliato da Bootstrap:

<div class="row">
      <div ng-repeat-start="value in values" class="col-md-4">
        {{value}}
      </div>
      <div ng-repeat-end ng-if="$index % 3 == 0" class="clearfix"></div>
</div>

Molti vantaggi: efficiente, veloce, utilizzando i consigli di Boostrap, evitando possibili problemi di $ digest e non alterando il modello angolare.


1

Questo esempio produce un ripetitore annidato in cui i dati esterni includono un array interno che volevo elencare in due colonne. Il concetto sarebbe valido per tre o più colonne.

Nella colonna interna ripeto la "riga" fino al raggiungimento del limite. Il limite è determinato dividendo la lunghezza della matrice di elementi per il numero di colonne desiderate, in questo caso per due. Il metodo di divisione si trova sul controller e viene passata la lunghezza dell'array corrente come parametro. La funzione JavaScript slice (0, array.length / columnCount) ha quindi applicato il limite al ripetitore.

Il secondo ripetitore di colonna viene quindi richiamato e ripete slice (array.length / columnCount, array.length) che produce la seconda metà dell'array nella colonna due.

<div class="row" ng-repeat="GroupAccess in UsersController.SelectedUser.Access" ng-class="{even: $even, odd: $odd}">
    <div class="col-md-12 col-xs-12" style=" padding-left:15px;">
        <label style="margin-bottom:2px;"><input type="checkbox" ng-model="GroupAccess.isset" />{{GroupAccess.groupname}}</label>
    </div>
    <div class="row" style=" padding-left:15px;">
        <div class="col-md-1 col-xs-0"></div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice(0, state.DivideBy2(GroupAccess.features.length))">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice( state.DivideBy2(GroupAccess.features.length), GroupAccess.features.length )">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-5 col-xs-8">
        </div>
    </div>
</div>


// called to format two columns
state.DivideBy2 = function(nValue) {
    return Math.ceil(nValue /2);
};

Spero che questo aiuti a guardare la soluzione in un altro modo ancora. (PS questo è il mio primo post qui! :-))


1

Risolvo senza .row

<div class="col col-33 left" ng-repeat="photo in photos">
   Content here...
</div>

e css

.left {
  float: left;
}

1

Ecco un modo facile e hacker per farlo. È più manuale e finisce con un markup disordinato. Non lo consiglio, ma ci sono situazioni in cui potrebbe essere utile.

Ecco un collegamento a violino http://jsfiddle.net/m0nk3y/9wcbpydq/

HTML:

<div ng-controller="myController">
    <div class="row">
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)*2">
                {{ person.name }}
                </div>
            </div>
        </div>
    </div>
</div>

JS:

var app = angular.module('myApp', []);

app.controller('myController', function($scope) {

    $scope.Math = Math;
    $scope.data = [
        {"name":"Person A"},
        ...
    ];
});

Questa configurazione ci richiede di utilizzare un po 'di matematica sul markup: /, quindi dovrai iniettare Math aggiungendo questa riga: $scope.Math = Math;


1

Tutte queste risposte sembrano eccessivamente ingegnerizzate.

Il metodo di gran lunga più semplice sarebbe impostare i div di input in un bootstrap di colonne col-md-4, quindi bootstrap lo formatterà automaticamente in 3 colonne a causa della natura a 12 colonne del bootstrap:

<div class="col-md-12">
    <div class="control-group" ng-repeat="oneExt in configAddr.ext">
        <div class="col-md-4">
            <input type="text" name="macAdr{{$index}}"
                   id="macAddress" ng-model="oneExt.newValue" value="" />
        </div>
    </div>
</div>

1
<div class="row">
  <div class="col-md-4" ng-repeat="remainder in [0,1,2]">
    <ul>
      <li ng-repeat="item in items" ng-if="$index % 3 == remainder">{{item}}</li>
    </ul>
  </div>
</div>

0

Basandosi sull'ottima risposta di m59. Ho scoperto che gli input del modello sarebbero sfocati se cambiassero, quindi puoi cambiare solo un personaggio alla volta. Questo è nuovo per gli elenchi di oggetti per chiunque ne abbia bisogno:

MODIFICA Aggiornato per gestire più filtri su una pagina

app.filter('partition', function() {
  var cache = {}; // holds old arrays for difference repeat scopes
  var filter = function(newArr, size, scope) {
    var i,
      oldLength = 0,
      newLength = 0,
      arr = [],
      id = scope.$id,
      currentArr = cache[id];
    if (!newArr) return;

    if (currentArr) {
      for (i = 0; i < currentArr.length; i++) {
        oldLength += currentArr[i].length;
      }
    }
    if (newArr.length == oldLength) {
      return currentArr; // so we keep the old object and prevent rebuild (it blurs inputs)
    } else {
      for (i = 0; i < newArr.length; i += size) {
        arr.push(newArr.slice(i, i + size));
      }
      cache[id] = arr;
      return arr;
    }
  };
  return filter;
}); 

E questo sarebbe l'uso:

<div ng-repeat="row in items | partition:3:this">
  <span class="span4">
    {{ $index }}
  </span>
</div>

Per quanto ne so, dovrebbe funzionare per la maggior parte del tempo, ma la logica di memorizzazione nella cache non sembra del tutto affidabile e il passaggio dell'ambito è imbarazzante. Consiglio vivamente di filtrare all'interno del controller quando sono necessari gli input. È comunque l'approccio tecnicamente corretto.
m59

0

Sono nuovo in bootstrap e angularjs, ma questo potrebbe anche rendere Array per 4 elementi come un gruppo, il risultato sarà quasi come 3 colonne. Questo trucco usa il principio della linea di interruzione bootstrap.

<div class="row">
 <div class="col-sm-4" data-ng-repeat="item in items">
  <div class="some-special-class">
   {{item.XX}}
  </div>
 </div>
</div>

0

Lodash ha ora un metodo a blocchi integrato che uso personalmente: https://lodash.com/docs#chunk

Sulla base di ciò, il codice del controller potrebbe essere simile al seguente:

$scope.groupedUsers = _.chunk( $scope.users, 3 )

Visualizza codice:

<div class="row" ng-repeat="rows in groupedUsers">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

0

Un altro modo è impostato width:33.33%; float:leftsu un div wrapper come questo:

<div ng-repeat="right in rights" style="width: 33.33%;float: left;">
    <span style="width:60px;display:inline-block;text-align:right">{{$index}}</span>
    <input type="number" style="width:50px;display:inline-block" ">
</div>

0

Mi sono trovato in un caso simile, volendo generare gruppi di visualizzazione di 3 colonne ciascuno. Tuttavia, anche se stavo usando bootstrap, stavo cercando di separare questi gruppi in div principali diversi. Volevo anche creare qualcosa di genericamente utile.

Mi sono avvicinato con 2 ng-repeatcome di seguito:

<div ng-repeat="items in quotes" ng-if="!($index % 3)">
  <div ng-repeat="quote in quotes" ng-if="$index <= $parent.$index + 2 && $index >= $parent.$index">
                ... some content ...
  </div>
</div>

Ciò rende molto facile passare a un numero diverso di colonne e separarle in diversi div principali.


0

Nel caso in cui qualcuno desideri un Angular 7 (e una versione successiva), ecco un esempio che ho usato in una delle mie applicazioni:

HTML:

                   <div class="container-fluid">
                    <div class="row" *ngFor="let reports of chunkData; index as i">
                        <div *ngFor="let report of reports" class="col-4 col-sm-4"
                            style="border-style:solid;background-color: antiquewhite">{{report}}</div>
                    </div>
                </div>

.TS FILE

export class ConfirmationPageComponent implements OnInit {
  chunkData = [];
  reportsArray = ["item 1", "item 2", "item 3", "item 4", "item 5", "item 6"];
  
  constructor() {}

  ngOnInit() {
    this.chunkData = this.chunk(this.reportsArray, 3);
  }

  chunk(arr, size) {
    var newArr = [];
    for (var i = 0; i < arr.length; i += size) {
      newArr.push(arr.slice(i, i + size));
    }
    return newArr;
  }
}

Questa è una soluzione fantastica per creare dinamicamente nuove colonne / righe a seconda di quanti elementi stai iterando dal database. Grazie!


-1

questo risponde alla domanda originale che è come ottenere 1,2,3 in una colonna. - chiesto da kuppu l'8 febbraio 14 alle 13:47

codice angularjs:

function GetStaffForFloor(floor) {
    var promiseGet = Directory_Service.getAllStaff(floor);
    promiseGet.then(function (pl) {
        $scope.staffList = chunk(pl.data, 3); //pl.data; //
    },
    function (errorOD) {
        $log.error('Errored while getting staff list.', errorOD);
    });
}
function chunk(array, columns) {
    var numberOfRows = Math.ceil(array.length / columns);

    //puts 1, 2, 3 into column
    var newRow = []; //array is row-based.
    for (var i = 0; i < array.length; i++) {
        var columnData = new Array(columns);
        if (i == numberOfRows) break;
        for (j = 0; j < columns; j++)
        {
            columnData[j] = array[i + numberOfRows * j];
        }
        newRow.push(columnData); 
    }
    return newRow;

    ////this works but 1, 2, 3 is in row
    //var newRow = [];
    //for (var i = 0; i < array.length; i += columns) {
    //    newRow.push(array.slice(i, i + columns)); //push effectively does the pivot. array is row-based.
    //}
    //return newRow;
};

Visualizza codice (nota: utilizzando bootstrap 3):

<div class="staffContainer">
    <div class="row" ng-repeat="staff in staffList">
        <div class="col-md-4" ng-repeat="item in staff">{{item.FullName.length > 0 ? item.FullName + ": Rm " + item.RoomNumber : ""}}</div>
    </div>
</div>

-1

Questo codice aiuterà ad allineare gli elementi con tre colonne in modalità lg e md, due colonne in modalità sm e una colonna singola è in modalità xs

<div class="row">
<div ng-repeat="oneExt in configAddr.ext">
    <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4">
        {$index+1}}. 
        <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress" ng-model="oneExt.newValue" value=""/>
    </div>
</div>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.