2013-02-07 4 views
9

Ich versuche, herauszufinden, wie dynamisch mit einer Klasse von row-fluid mit angular.js mit der ng-repeat Richtlinie bootstrap Reihe divs erstellen. HierAngularjs Bootstrap verwenden und dynamisch Erstellen von Zeilen

die Winkel:

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

Dies gilt allerdings nicht Arbeit. Die bootstrap html Ich möchte erzeugen, ist:

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

Im Grunde brauche ich eine neue <div class="row-fluid"> mod 2 des Index innerhalb des ng-Repeat, und wenn ihr 0, schließen sich die </div> und erstellen zu tun. Wie ist das möglich?

+0

Sie können die vordefinierte Variable verwenden _ $ index_ innerhalb der _ng-repeat_ Schleife – remigio

+0

Können Sie ein Beispiel geben, wie genau würde $ index helfen? Wir brauchen grundsätzlich eine 'if'-Anweisung innerhalb der 'ng-Wiederholung'. – Justin

+0

Ich beobachtete das Beispiel, es gibt keine Möglichkeit, es mit _ngRepeat_ zu tun. Sie sollten eine benutzerdefinierte Direktive schreiben, die html dinamisch erzeugt – remigio

Antwort

14

Die Idee ist, Ihre Elemente zu filtern, um sie zu gruppieren, und eine zweite ngRepeat zu erstellen, um auf Unterelemente zu iterieren.

Zunächst fügen Sie diesen Filter zu Ihrem Modul:

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; 
     } 
    }; 
}); 

In Ihrem Controler (denn wenn Sie direkt in Ihrer Vorlage auswählen, dann werden Sie eine $digest loop haben):

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

Und in Ihre .html:

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

Für alle Stolpersteine ​​über dies sollte dies die akzeptierte Antwort sein - funktionierte nur gut für mich. – Jascination

+0

Auf der einen Seite vermeidet dies die Verwendung komplizierter Direktiven (die auf allen Elementen ng-repeat und die Zeilen und Spalten dynamisch erstellen).Auf der anderen Seite - die Elemente wurden jetzt aufgeteilt, so dass sie und andere 'alle Elemente' Funktionen mit 2-Wege-Bindung weniger durchlaufen ... nice :-P –

+1

So geht das in der Ansicht ohne die unendliche Digest: http : //stackoverflow.com/a/21653981/1435655 – m59

0

Off Topic: mit Bootstrap Du kannst divs der Klasse = "span6 well" einfach in eine große Reihe setzen, da sie gut gestapelt werden. (Sie erhalten auch ein responsives Layout). Es tut uns leid, wenn es nur ein Beispiel für das Verhalten war, das Bootstrap nicht behandeln kann. Anthony und Remigio haben recht; Sie müssen ein zusätzliches Modulfahrzeug erstellen, das divs erzeugt, die in Ihre ng-wiederholten Tags eingetaucht sind.

+0

Dies ist nicht ganz richtig. Manchmal funktioniert es, manchmal wird es nicht, abhängig von der Höhe der Divs. – arg20

4

Als eine Verbesserung der Antwort, die Anthony gab, würde ich sagen, dass Sie sich eine Menge Mühe mit der Slice-Methode sparen könnten, anstatt all diese Bedingungen durchzugehen.

Versuchen Sie Filter definieren, wie folgt:

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; 
     } 
    }; 
}); 

Danach können Sie den Filter auf dem Controller aufrufen kann als Anthony in seiner Antwort wies darauf hin:

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