2013-02-07 27 views
9

Sto cercando di capire come creare dinamicamente bootstrap div fila con una classe di row-fluid con angular.js utilizzando la direttiva ng-repeat.Angular.js utilizzando bootstrap e la creazione dinamica di file

Ecco l'angolare:

<div ng-repeat="task in tasks" class="row-fluid"> 
    <div class="span6 well">{{task.name}}</div> 
</div> 

Questo fa non lavoro però. Il bootstrap html vorrei generare è:

http://jsfiddle.net/YKkXA/2/

Fondamentalmente ho bisogno di fare mod 2 dell'indice all'interno della ng-repeat, e se il suo 0, chiudere il </div> e creare un nuovo <div class="row-fluid">. Com'è possibile?

+0

È possibile utilizzare la variabile predefinita _ $ index_ all'interno del ciclo _ng-repeat_ – remigio

+0

Puoi fare un esempio, in che modo esattamente '$ index' ci può aiutare? Fondamentalmente abbiamo bisogno di un'istruzione 'if' all'interno di' ng-repeat'. – Justin

+0

Ho visto l'esempio, non c'è modo di farlo usando _ngRepeat_. Dovresti scrivere una direttiva personalizzata, creando dinamicamente l'html – remigio

risposta

14

L'idea è di filtrare i tuoi articoli per raggrupparli e fare un secondo ngRepeat per iterare su sotto-voci.

In primo luogo, aggiungere che il filtro al modulo:

module.filter('groupBy', function() { 
    return function(items, groupedBy) { 
     if (items) { 
      var finalItems = [], 
       thisGroup; 
      for (var i = 0; i < items.length; i++) { 
       if (!thisGroup) { 
        thisGroup = []; 
       } 
       thisGroup.push(items[i]); 
       if (((i+1) % groupedBy) === 0) { 
        finalItems.push(thisGroup); 
        thisGroup = null; 
       } 
      } 
      if (thisGroup) { 
       finalItems.push(thisGroup); 
      } 
      return finalItems; 
     } 
    }; 
}); 

Nel vostro controler (perché se si filtra direttamente nel tuo modello, allora si avrà un $digest loop):

function TaskCtrl() { 
    $scope.tasksGroupBy2 = $filter('groupBy')(taskGroup, 2); 
} 

E in il tuo .html:

<div ng-repeat="taskGroup in tasksGroupBy2" class="row-fluid"> 
    <div ng-repeat="task in taskGroup" class="span6 well">{{task.name}}</div> 
</div> 
+0

Per chiunque si imbatta in questa, questa dovrebbe essere la risposta accettata - ha funzionato bene per me. – Jascination

+0

Da un lato, questo evita l'utilizzo di direttive complicate (che si ripetono su tutti gli elementi e creano dinamicamente righe e colonne).D'altra parte - gli oggetti sono stati divisi, rendendo il loro movimento e le altre funzioni di tutti gli elementi con bind a 2 vie meno ... bello :-P –

+1

Ecco come fare nella vista senza il digest infinito: http : //stackoverflow.com/a/21653981/1435655 – m59

0

Off Topic: utilizzo di bootstrap puoi semplicemente posizionare div di classe = "span6 bene" in una fila di bigass che si impilano bene. (Avrai anche un layout reattivo). Scusate se era solo un esempio del comportamento che il bootstrap non può gestire. Anthony e Remigio hanno ragione; devi creare un veicolo modulo aggiuntivo che genererà le immersioni immerse nei tuoi tag ng-ripetuti.

+0

Questo non è del tutto corretto. A volte funziona, altre volte no, a seconda dell'altezza delle div. – arg20

4

Come un miglioramento alla risposta che Anthony ha dato, direi che potresti risparmiare un sacco di problemi usando il metodo slice invece di attraversare tutte quelle condizioni.

Prova definire il filtro come segue:

module.filter('group', function() { 
    return function(items, groupItems) { 
     if (items) { 
      var newArray = []; 

      for (var i = 0; i < items.length; i+=groupItems) { 
       if (i + groupItems > items.length) { 
        newArray.push(items.slice(i)); 
       } else { 
        newArray.push(items.slice(i, i + groupItems)); 
       } 
      } 

      return newArray; 
     } 
    }; 
}); 

Dopo di che si può chiamare il filtro del controller come Anthony ha sottolineato nella sua risposta:

function Controller ($scope) { 
    $scope.itemsGrouped = $filter('group')(itemsArray, 5); 
} 
Problemi correlati