Le script ci-dessous affiche un panier à l'aide de ng-repeat
. Pour chaque élément du tableau, il affiche le nom de l'élément, son montant et le sous-total ( product.price * product.quantity
).
Quelle est la manière la plus simple de calculer le prix total des éléments répétés?
<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
garder la pêche
la source
la source
Réponses:
Dans le modèle
Dans le contrôleur
la source
Cela fonctionne également à la fois le filtre et la liste normale. La première chose à faire pour créer un nouveau filtre pour la somme de toutes les valeurs de la liste, ainsi qu'une solution donnée pour une somme de la quantité totale. Dans les détails, vérifiez le lien du violoniste .
vérifier ce lien Fiddle
la source
'undefined'
en utilisant leresultValue
, mais si je l'utilise,items
cela fonctionne bien, des idées .. ??items
cela ne fonctionnera pas avec les filtres, aidez-moi!ng-repeat="campaign in filteredCampaigns=(campaigns | filter:{'name':q})"
et{{ filteredCampaigns | campaignTotal: 'totalCommission' | number: 2 }}
Réaliser cela a répondu il y a longtemps, mais je voulais publier une approche différente non présentée ...
Utilisez
ng-init
pour calculer votre total. De cette façon, vous n'avez pas besoin d'itérer dans le HTML et d'itérer dans le contrôleur. Dans ce scénario, je pense que c'est une solution plus propre / plus simple. (Si la logique de comptage était plus complexe, je recommanderais certainement de déplacer la logique vers le contrôleur ou le service, le cas échéant.)Bien entendu, dans votre contrôleur, définissez / initialisez simplement votre
Total
champ:la source
Vous pouvez calculer le total à l'intérieur de la
ng-repeat
suite:Vérifiez le résultat ici: http://plnkr.co/edit/Gb8XiCf2RWiozFI3xWzp?p=preview
En cas de résultat de la mise à jour automatique: http://plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p=preview (Merci - VicJordan)
la source
tbody
est initialisé une seule fois, maistr
chaque fois que la liste est filtrée, ce qui entraîne une somme incorrecte$scope
C'est ma solution
filtre personnalisé doux et simple:
(mais uniquement lié à une simple somme de valeurs, pas à un produit de somme, j'ai créé un
sumProduct
filtre et l' ai ajouté en tant que modification à cet article).JS Fiddle
EDIT: sumProduct
C'est un
sumProduct
filtre, il accepte n'importe quel nombre d'arguments. En tant qu'argument, il accepte le nom de la propriété à partir des données d'entrée, et il peut gérer la propriété imbriquée (imbrication marquée par un point:)property.nested
;voici JS Fiddle et le code
JS Fiddle
la source
Solution simple
Voici une solution simple. Aucune boucle for supplémentaire requise.
Partie HTML
Partie de script
la source
Une autre façon de résoudre ce problème, s'étendant de la réponse de Vaclav pour résoudre ce calcul particulier - c'est-à-dire un calcul sur chaque ligne.
Pour ce faire avec un calcul, ajoutez simplement une fonction de calcul à votre périmètre, par exemple
Vous utiliseriez
{{ datas|total:calcItemTotal|currency }}
dans votre code HTML. Cela présente l'avantage de ne pas être appelé pour chaque résumé, car il utilise des filtres et peut être utilisé pour des totaux simples ou complexes.JSFiddle
la source
C'est un moyen simple de le faire avec ng-repeat et ng-init pour agréger toutes les valeurs et étendre le modèle avec une propriété item.total.
La directive ngInit appelle la fonction set total pour chaque élément. La fonction setTotals du contrôleur calcule le total de chaque élément. Il utilise également les variables de portée factureCount et factureTotal pour agréger (additionner) la quantité et le total de tous les articles.
pour plus d'informations et une démonstration, consultez ce lien:
http://www.ozkary.com/2015/06/angularjs-calculate-totals-using.html
la source
Je préfère les solutions élégantes
Dans le modèle
Dans le contrôleur
Si vous utilisez ES2015 (alias ES6)
la source
Vous pouvez utiliser un filtre angulaire personnalisé qui prend en compte le tableau d'objets de l'ensemble de données et la clé de chaque objet. Le filtre peut alors renvoyer la somme:
Ensuite, dans votre tableau pour additionner une colonne, vous pouvez utiliser:
la source
Vous pouvez essayer d'utiliser les services de angular js, cela a fonctionné pour moi ... en donnant les extraits de code ci-dessous
Code contrôleur:
Code de service:
la source
voici ma solution à ce problème:
scénario
réduire s'exécutera pour chaque produit de la gamme de produits. Accumulator est le montant total accumulé, currentValue est l'élément actuel du tableau et le 0 dans le dernier est la valeur initiale
la source
J'ai développé un peu la réponse de RajaShilpa. Vous pouvez utiliser une syntaxe comme:
afin que vous puissiez accéder à l'objet enfant d'un objet. Voici le code du filtre:
la source
Prendre la réponse de Vaclav et la rendre plus angulaire:
Cela vous donne même l'avantage d'accéder aux données imbriquées et de tableau:
la source
En html
en javascript
la source
La réponse de Huy Nguyen est presque là. Pour le faire fonctionner, ajoutez:
... à la ligne avec ng-init. La liste a toujours un seul élément, donc Angular répétera le bloc exactement une fois.
La démo de Zybnek utilisant le filtrage peut être mise en œuvre en ajoutant:
Voir http://plnkr.co/edit/dLSntiy8EyahZ0upDpgy?p=preview .
la source
la source
C'est ma solution
Cela nécessite que vous ajoutiez un nom au contrôleur
Controller as SomeName
afin que nous puissions mettre en cache la variable (est-ce vraiment nécessaire? Je ne suis pas familier avec l'utilisation de $ parent donc je ne sais pas)Puis pour chaque répétition, ajoutez
ng-init"SomeName.SumVariable = ($first ? 0 : SomeName.SumVariable) + repeatValue"
$first
pour le vérifier, il est d'abord remis à zéro, sinon il continuerait la valeur agrégéehttp://jsfiddle.net/thainayu/harcv74f/
la source
Après avoir lu toutes les réponses ici - comment résumer les informations groupées, j'ai décidé de tout ignorer et je viens de charger l'une des bibliothèques javascript SQL. J'utilise alasql, ouais cela prend quelques secondes de plus sur le temps de chargement mais économise un temps infini dans le codage et le débogage, maintenant pour grouper et sum () je viens d'utiliser,
Je sais que cela ressemble un peu à une diatribe sur angular / js, mais SQL a vraiment résolu cela il y a plus de 30 ans et nous ne devrions pas avoir à le réinventer dans un navigateur.
la source