2016-06-10 11 views
3

Also, die Situation, die ich habe, ist das Durchlaufen einer Liste von JSON-Objekten, die eine Liste als Attribut enthalten. Ich habe eine innere Schleife, die sich auf diesem Listenattribut wiederholt. Etwas nach dem Vorbild dieser:Angular.js: Wie man die Anzahl der Elemente in verschachtelten ng-Wiederholungen zählt

Number of results: {{count}} 

<div ng-repeat="jsonObject in outerList | someFilter" ng-show="innerList.length"> 
    <h1>{{jsonObject.Name}}</h1><br> 
    <div ng-repeat="items in jsonObject.listAttr | someOtherFilter as innerList"> 
     {{items.data}}<br> 
    </div> 
    <br> 
</div> 

Das Problem, das ich bin vor ist die Suche nach einem Weg, um eine aggregierte Anzahl aller Elemente in jeder Iteration der inneren Wiederholung zu greifen. Also, wenn das erste jsonObject 2 Dinge hat, die mit dem inneren Filter übereinstimmen, und das zweite jsonObject 3 Dinge hat, die mit dem inneren Filter übereinstimmen, zeigen wir eine Anzahl von 5 außerhalb der ganzen Schleife (in der Zählvariablen oben oder etwas ähnliches).

Ich habe eine Reihe von Möglichkeiten untersucht, um diese Zahl zu bekommen, aber ohne Erfolg. Einer der Schlüssel, die in einige Lösungen geworfen wird, ist, dass die Filter sind etwas, das der Benutzer im laufenden Betrieb (über ein Suchfeld zum Beispiel) ändern kann, so kann ich nicht nur alle Filter in anwenden Controller beim Laden der Seite und zeigt das an. Ich kann mit 5 Objekte, bis der Benutzer tippt etwas in das Suchfeld starten, der die Nummer 2. abfällt

+0

Sie können dies möglicherweise tun, indem Sie die Länge von jedem verwenden und sie auf dem Alias ​​addieren, der den gefilterten Listen gegeben wird. Ich habe dies für andere ähnliche Fälle mit einigen grundlegenden Zeigern hier getan: http://angular-tips.com/blog/2014/08/tip-accessing-filtered-array-outside-ng-repeat/ – user1934587390

Antwort

1

Ich denke, dass Sie dieses wünschen ...

Funktion im $ scope

$scope.moreOne = function(counter) { 
    $scope[counter]++; 
} 

Jedes Element in JSONObject wird diese

<div ng-repeat="jsonObject in outerList | someFilter" ng-show="innerList.length"> 
     <h1>{{jsonObject.Name}}</h1><br> 
     <div ng-repeat="items in jsonObject.listAttr | someOtherFilter as innerList" ng-init="moreOne('count')"> 
      {{items.data}}<br> 
     </div> 
     <br> 
    </div> 

gezählt Haben Sie den ng-init sehen?

Vielleicht ist diese Lösung nicht die beste ... Saludos! :-)

UPDATE

Ok, können Sie Beobachter verwenden, um die Änderungen des Modells an die Steuerung. Wenn sich outerList oder eine beliebige Variable (Sie können einen Watcher für eine Eigenschaft definieren) ändert, wird der Watcher ausgelöst. Und Sie brauchen diesen Code nur ohne moreOne Funktion :-)

$scope.$watch("outerList", function(list) { 
     $scope.count = 0; 
     for(var i = 0; i < list.length; i++) { 
     $scope.count += list[i]['listAttr'].length; 
     } 
    }); 
+0

Ich sah ähnliche Lösungen dies an anderer Stelle, aber das wird nicht dynamisch aktualisiert, oder? Wenn die Liste durch Filter/etc auf den neuesten Stand gebracht wird, würde sie einfach zur Zählung hinzufügen und niemals auf 0 zurücksetzen? –

+0

@ Dominator_101, ich habe meine Antwort aktualisiert. Ich hoffe dir zu helfen :-) –