Das folgende Skript zeigt einen Einkaufswagen mit an ng-repeat
. Für jedes Element im Array werden der Elementname, seine Menge und die Zwischensumme ( product.price * product.quantity
) angezeigt .
Was ist der einfachste Weg, um den Gesamtpreis für wiederholte Elemente zu berechnen?
<table>
<tr>
<th>Product</th>
<th>Quantity</th>
<th>Price</th>
</tr>
<tr ng-repeat="product in cart.products">
<td>{{product.name}}</td>
<td>{{product.quantity}}</td>
<td>{{product.price * product.quantity}} €</td>
</tr>
<tr>
<td></td>
<td>Total :</td>
<td></td> <!-- Here is the total value of my cart -->
</tr>
</table>
angularjs
angularjs-ng-repeat
keepthepeach
quelle
quelle
Antworten:
In Vorlage
Im Controller
quelle
Dies funktioniert sowohl im Filter als auch in der normalen Liste. Das erste, was Sie tun müssen, um einen neuen Filter für die Summe aller Werte aus der Liste zu erstellen und eine Lösung für die Summe der Gesamtmenge zu erhalten. Im Detail Code überprüfen Sie es Geiger Link .
Überprüfen Sie diesen Fiddle Link
quelle
'undefined'
wenn ich das benutzeresultValue
, aber wenn ich es benutzeitems
, funktioniert es gut, irgendwelche Ideen .. ??items
, funktioniert es nicht mit Filtern, Hilfe!ng-repeat="campaign in filteredCampaigns=(campaigns | filter:{'name':q})"
und{{ filteredCampaigns | campaignTotal: 'totalCommission' | number: 2 }}
Dies zu realisieren, wurde vor langer Zeit beantwortet, wollte aber einen anderen Ansatz veröffentlichen, der nicht vorgestellt wurde ...
Verwenden Sie,
ng-init
um Ihre Gesamtsumme zu zählen. Auf diese Weise müssen Sie nicht im HTML und im Controller iterieren. In diesem Szenario halte ich dies für eine sauberere / einfachere Lösung. (Wenn die Zähllogik komplexer wäre, würde ich definitiv empfehlen, die Logik entsprechend auf die Steuerung oder den Dienst zu verschieben.)Definieren / initialisieren Sie in Ihrem Controller natürlich einfach Ihr
Total
Feld:quelle
Sie können die Gesamtsumme im Inneren berechnen
ng-repeat
:Überprüfen Sie das Ergebnis hier: http://plnkr.co/edit/Gb8XiCf2RWiozFI3xWzp?p=preview
Falls das Ergebnis der automatischen Aktualisierung vorliegt : http://plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p=preview (Danke - VicJordan)
quelle
tbody
wird nur einmal initialisiert, abertr
jedes Mal , wenn die Liste gefiltert wird, was zu einer falschen Summe führt$scope
Das ist meine Lösung
süßer und einfacher kundenspezifischer Filter:
(aber nur im Zusammenhang mit der einfachen Summe von Werten, nicht dem Summenprodukt, habe ich einen
sumProduct
Filter erstellt und ihn als Bearbeitung an diesen Beitrag angehängt).JS Fiddle
EDIT: sumProduct
Dies ist ein
sumProduct
Filter, der eine beliebige Anzahl von Argumenten akzeptiert. Als Argument akzeptiert es den Namen der Eigenschaft aus den Eingabedaten und kann verschachtelte Eigenschaften verarbeiten (Verschachtelung markiert durch Punkt :)property.nested
;Hier ist JS Fiddle und der Code
JS Fiddle
quelle
Einfache Lösung
Hier ist eine einfache Lösung. Keine zusätzliche for-Schleife erforderlich.
HTML-Teil
Skriptteil
quelle
Eine andere Möglichkeit, dies zu lösen , erstreckt sich von Vaclavs Antwort auf die Lösung dieser speziellen Berechnung - dh einer Berechnung für jede Zeile.
Um dies mit einer Berechnung zu tun, fügen Sie einfach eine Berechnungsfunktion zu Ihrem Bereich hinzu, z
Sie würden
{{ datas|total:calcItemTotal|currency }}
in Ihrem HTML-Code verwenden. Dies hat den Vorteil, dass nicht bei jedem Digest aufgerufen wird, da Filter verwendet werden und für einfache oder komplexe Summen verwendet werden können.JSFiddle
quelle
Dies ist eine einfache Möglichkeit, dies mit ng-repeat und ng-init zu tun, um alle Werte zu aggregieren und das Modell mit einer item.total-Eigenschaft zu erweitern.
Die Anweisung ngInit ruft die Funktion set total für jedes Element auf. Die Funktion setTotals in der Steuerung berechnet die Gesamtsumme jedes Elements. Außerdem werden die Bereichsvariablen invoiceCount und invoiceTotal verwendet, um die Menge und die Summe aller Artikel zu aggregieren (zu summieren).
Weitere Informationen und eine Demo finden Sie unter diesem Link:
http://www.ozkary.com/2015/06/angularjs-calculate-totals-using.html
quelle
Ich bevorzuge elegante Lösungen
In Vorlage
Im Controller
Wenn Sie ES2015 (auch bekannt als ES6) verwenden
quelle
Sie können einen benutzerdefinierten Winkelfilter verwenden, der das Datensatzobjektarray und den Schlüssel in jedem Objekt summiert. Der Filter kann dann die Summe zurückgeben:
Dann können Sie in Ihrer Tabelle eine Spalte zusammenfassen:
quelle
Sie können versuchen, Dienste von eckigen js zu verwenden, es hat für mich funktioniert .. Geben Sie die Code-Schnipsel unten
Controller-Code:
Service code:
quelle
Hier ist meine Lösung für dieses Problem:
Skript
Reduzieren wird für jedes Produkt im Produktarray ausgeführt. Der Akkumulator ist der gesamte akkumulierte Betrag, currentValue ist das aktuelle Element des Arrays und die 0 im letzten ist der Anfangswert
quelle
Ich habe RajaShilpas Antwort etwas erweitert. Sie können folgende Syntax verwenden:
damit Sie auf das untergeordnete Objekt eines Objekts zugreifen können. Hier ist der Code für den Filter:
quelle
Nehmen Sie Vaclavs Antwort und machen Sie sie eckiger:
Dies bietet Ihnen den Vorteil, dass Sie sogar auf verschachtelte Daten und Array-Daten zugreifen können:
quelle
In HTML
in Javascript
quelle
Huy Nguyens Antwort ist fast da. Fügen Sie Folgendes hinzu, damit es funktioniert:
... zur Zeile mit ng-init. Die Liste enthält immer ein einzelnes Element, sodass Angular den Block genau einmal wiederholt.
Zybneks Demo mit Filterung kann durch Hinzufügen von:
Siehe http://plnkr.co/edit/dLSntiy8EyahZ0upDpgy?p=preview .
quelle
quelle
Das ist meine Lösung
Sie müssen dem Controller einen Namen hinzufügen,
Controller as SomeName
damit wir dort Variablen zwischenspeichern können (ist dies wirklich erforderlich? Ich bin mit der Verwendung von $ parent nicht vertraut, daher weiß ich es nicht).Fügen Sie dann für jede Wiederholung hinzu
ng-init"SomeName.SumVariable = ($first ? 0 : SomeName.SumVariable) + repeatValue"
$first
Zum Überprüfen wird es zuerst auf Null zurückgesetzt, andernfalls wird der Gesamtwert fortgesetzthttp://jsfiddle.net/thainayu/harcv74f/
quelle
Nachdem ich alle Antworten hier gelesen hatte - wie man gruppierte Informationen zusammenfasst -, entschied ich mich, alles zu überspringen und lud einfach eine der SQL-Javascript-Bibliotheken. Ich benutze alasql, ja, es dauert ein paar Sekunden länger beim Laden, spart aber unzählige Zeit beim Codieren und Debuggen. Nun zu group and sum () Ich benutze nur,
Ich weiß, das klingt wie ein Scherz über Angular / JS, aber SQL hat dies vor über 30 Jahren wirklich gelöst, und wir sollten es nicht in einem Browser neu erfinden müssen.
quelle