El siguiente script muestra un carrito de la compra usando ng-repeat
. Para cada elemento de la matriz, muestra el nombre del artículo, su monto y el subtotal (product.price * product.quantity
).
¿Cuál es la forma más sencilla de calcular el precio total de elementos repetidos?
<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
mantener el melocotón
fuente
fuente
Respuestas:
En plantilla
En controlador
fuente
Esto también funciona tanto con el filtro como con la lista normal. Lo primero es crear un nuevo filtro para la suma de todos los valores de la lista, y también dar solución para una suma de la cantidad total. En el código de detalles, verifique el enlace de violinista .
mira este enlace de violín
fuente
'undefined'
al usar elresultValue
, pero si lo usoitems
funciona bien, ¿alguna idea .. ??items
no funcionará con filtros, ¡ayuda!ng-repeat="campaign in filteredCampaigns=(campaigns | filter:{'name':q})"
y{{ filteredCampaigns | campaignTotal: 'totalCommission' | number: 2 }}
Al darme cuenta de esto respondió hace mucho tiempo, pero quería publicar un enfoque diferente no presentado ...
Use
ng-init
para contar su total. De esta manera, no tiene que iterar en el HTML e iterar en el controlador. En este escenario, creo que esta es una solución más limpia / simple. (Si la lógica de conteo fuera más compleja, definitivamente recomendaría mover la lógica al controlador o al servicio según corresponda).Por supuesto, en su controlador, simplemente defina / inicialice su
Total
campo:fuente
Puede calcular el total interior
ng-repeat
siguiente:Compruebe el resultado aquí: http://plnkr.co/edit/Gb8XiCf2RWiozFI3xWzp?p=preview
En caso de resultado de actualización automática: http://plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p=preview (Gracias - VicJordan)
fuente
tbody
se inicializa solo una vez, perotr
cada vez que se filtra la lista, lo que resulta en una suma incorrecta$scope
Esta es mi solucion
filtro personalizado dulce y simple:
(pero solo relacionado con la suma simple de valores, no el producto de la suma, he creado un
sumProduct
filtro y lo he agregado como edición a esta publicación).JS violín
EDITAR: sumProduct
Este es un
sumProduct
filtro, acepta cualquier número de argumentos. Como argumento, acepta el nombre de la propiedad de los datos de entrada y puede manejar la propiedad anidada (anidamiento marcado con un punto :)property.nested
;aquí está JS Fiddle y el código
JS violín
fuente
Solución simple
He aquí una solución sencilla. No se requiere bucle for adicional.
Parte HTML
Parte del guion
fuente
Otra forma de resolver esto, que se extiende desde la respuesta de Vaclav para resolver este cálculo en particular, es decir, un cálculo en cada fila.
Para hacer esto con un cálculo, simplemente agregue una función de cálculo a su alcance, por ejemplo
Usarías
{{ datas|total:calcItemTotal|currency }}
en tu código HTML. Esto tiene la ventaja de que no se llama para todos los resúmenes, porque utiliza filtros y se puede utilizar para totales simples o complejos.JSFiddle
fuente
Esta es una forma sencilla de hacer esto con ng-repeat y ng-init para agregar todos los valores y extender el modelo con una propiedad item.total.
La directiva ngInit llama a la función set total para cada elemento. La función setTotals del controlador calcula el total de cada artículo. También utiliza las variables de alcance invoiceCount y invoiceTotal para agregar (sumar) la cantidad y el total de todos los artículos.
para obtener más información y una demostración, consulte este enlace:
http://www.ozkary.com/2015/06/angularjs-calculate-totals-using.html
fuente
Prefiero soluciones elegantes
En plantilla
En controlador
Si está utilizando ES2015 (también conocido como ES6)
fuente
Puede usar un filtro angular personalizado que toma la matriz de objetos del conjunto de datos y la clave en cada objeto para sumar. El filtro puede devolver la suma:
Luego, en su tabla para sumar una columna, puede usar:
fuente
Puede intentar usar los servicios de angular js, me ha funcionado ... dando los siguientes fragmentos de código
Código del controlador:
Código de servicio:
fuente
aquí está mi solución a este problema:
guión
reducir se ejecutará para cada producto en la gama de productos. Acumulador es la cantidad total acumulada, currentValue es el elemento actual de la matriz y el 0 en el último es el valor inicial
fuente
Amplié un poco la respuesta de RajaShilpa. Puede utilizar una sintaxis como:
para que pueda acceder al objeto secundario de un objeto. Aquí está el código del filtro:
fuente
Tomando la respuesta de Vaclav y haciéndola más parecida a Angular:
Esto le brinda la ventaja de acceder incluso a datos anidados y de matriz:
fuente
En html
en javascript
fuente
La respuesta de Huy Nguyen casi está ahí. Para que funcione, agregue:
... a la línea con ng-init. La lista siempre tiene un solo elemento, por lo que Angular repetirá el bloque exactamente una vez.
Se puede hacer que la demostración de Zybnek usando filtrado funcione agregando:
Consulte http://plnkr.co/edit/dLSntiy8EyahZ0upDpgy?p=preview .
fuente
fuente
Esta es mi solucion
Requiere que agregue un nombre al controlador como
Controller as SomeName
para que podamos almacenar en caché la variable allí (¿realmente es necesario? No estoy familiarizado con el uso de $ parent, así que no lo sé)Luego, para cada repetición, agregue
ng-init"SomeName.SumVariable = ($first ? 0 : SomeName.SumVariable) + repeatValue"
$first
para verificarlo, primero, luego se restablece a cero, de lo contrario, continuaría el valor agregadohttp://jsfiddle.net/thainayu/harcv74f/
fuente
Después de leer todas las respuestas aquí: cómo resumir la información agrupada, decidí omitirlo todo y simplemente cargué una de las bibliotecas SQL de JavaScript. Estoy usando alasql, sí, tarda unos segundos más en el tiempo de carga, pero ahorra un tiempo incontable en la codificación y la depuración, ahora para agrupar y sumar () solo uso,
Sé que esto suena como una perorata sobre angular / js, pero realmente SQL resolvió esto hace más de 30 años y no deberíamos tener que reinventarlo dentro de un navegador.
fuente