O script abaixo exibe um carrinho de compras usando ng-repeat
. Para cada elemento da matriz, ele mostra o nome do item, sua quantidade e o subtotal ( product.price * product.quantity
).
Qual é a maneira mais simples de calcular o preço 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
manter o pêssego
fonte
fonte
Respostas:
No modelo
No controlador
fonte
Isso também está funcionando tanto no filtro quanto na lista normal. A primeira coisa a fazer é criar um novo filtro para a soma de todos os valores da lista, e também dada solução para a soma da quantidade total. No código de detalhes, verifique o link do violinista .
verifique este Fiddle Link
fonte
'undefined'
quando uso oresultValue
, mas se eu usaritems
funciona bem, alguma ideia .. ??items
, não funcionará com filtros, ajude!ng-repeat="campaign in filteredCampaigns=(campaigns | filter:{'name':q})"
e{{ filteredCampaigns | campaignTotal: 'totalCommission' | number: 2 }}
Percebendo isso respondi há muito tempo, mas queria postar abordagem diferente não apresentada ...
Use
ng-init
para contabilizar seu total. Dessa forma, você não precisa iterar no HTML e no controlador. Nesse cenário, acho que essa é uma solução mais limpa / simples. (Se a lógica de cálculo fosse mais complexa, eu definitivamente recomendaria mover a lógica para o controlador ou serviço, conforme apropriado.)Claro, em seu controlador, basta definir / inicializar seu
Total
campo:fonte
Você pode calcular o total a
ng-repeat
seguir:Verifique o resultado aqui: http://plnkr.co/edit/Gb8XiCf2RWiozFI3xWzp?p=preview
No caso de resultado da atualização automática: http://plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p=preview (Obrigado - VicJordan)
fonte
tbody
é inicializada apenas uma vez, mastr
cada vez que a lista é filtrada, resultando em soma incorreta$scope
Esta é a minha solução
filtro personalizado doce e simples:
(mas apenas relacionado à simples soma de valores, não à soma do produto, criei um
sumProduct
filtro e o anexei como edição a este post).JS Fiddle
EDIT: sumProduct
Este é um
sumProduct
filtro que aceita qualquer número de argumentos. Como argumento, ele aceita o nome da propriedade dos dados de entrada e pode manipular propriedades aninhadas (aninhamento marcado por ponto:)property.nested
;aqui está JS Fiddle e o código
JS Fiddle
fonte
Solução Simples
Aqui está uma solução simples. Nenhum loop adicional necessário.
Parte HTML
Parte do Script
fonte
Outra maneira de resolver isso, estendendo-se da resposta de Vaclav para resolver esse cálculo específico - ou seja, um cálculo em cada linha.
Para fazer isso com um cálculo, basta adicionar uma função de cálculo ao seu escopo, por exemplo
Você usaria
{{ datas|total:calcItemTotal|currency }}
em seu código HTML. Tem a vantagem de não ser chamado para todos os resumos, porque usa filtros e pode ser usado para totais simples ou complexos.JSFiddle
fonte
Esta é uma maneira simples de fazer isso com ng-repeat e ng-init para agregar todos os valores e estender o modelo com uma propriedade item.total.
A diretiva ngInit chama a função total definida para cada item. A função setTotals no controlador calcula o total de cada item. Ele também usa as variáveis de escopo invoiceCount e invoiceTotal para agregar (somar) a quantidade e o total de todos os itens.
para mais informações e uma demonstração, veja este link:
http://www.ozkary.com/2015/06/angularjs-calculate-totals-using.html
fonte
Eu prefiro soluções elegantes
No modelo
No controlador
Se você estiver usando ES2015 (também conhecido como ES6)
fonte
Você pode usar um filtro angular personalizado que soma a matriz de objetos do conjunto de dados e a chave de cada objeto. O filtro pode então retornar a soma:
Em seguida, em sua tabela para somar uma coluna, você pode usar:
fonte
Você pode tentar usar os serviços do angular js, tem funcionado para mim ... dando os trechos de código abaixo
Código do controlador:
Código de Serviço:
fonte
aqui está minha solução para este problema:
roteiro
reduzir será executado para cada produto na matriz de produtos. Acumulador é a quantidade total acumulada, currentValue é o elemento atual da matriz e o 0 no último é o valor inicial
fonte
Ampliei um pouco a resposta de RajaShilpa. Você pode usar sintaxe como:
para que você possa acessar o objeto filho de um objeto. Aqui está o código do filtro:
fonte
Tomando a resposta de Vaclav e tornando-a mais angular:
Isso oferece a vantagem de acessar dados aninhados e de matriz:
fonte
Em html
em javascript
fonte
A resposta de Huy Nguyen está quase lá. Para fazer funcionar, adicione:
... para a linha com ng-init. A lista sempre tem um único item, então o Angular repetirá o bloco exatamente uma vez.
A demonstração de Zybnek usando filtragem pode funcionar adicionando:
Consulte http://plnkr.co/edit/dLSntiy8EyahZ0upDpgy?p=preview .
fonte
fonte
Esta é a minha solução
Exige que você adicione o nome ao controlador
Controller as SomeName
para que possamos armazenar as variáveis lá (é realmente necessário? Não estou familiarizado com o uso de $ parent, então não sei)Então, para cada repetição, adicione
ng-init"SomeName.SumVariable = ($first ? 0 : SomeName.SumVariable) + repeatValue"
$first
para verificar é primeiro, em seguida, ele redefinido para zero, caso contrário, ele continuaria agregando valorhttp://jsfiddle.net/thainayu/harcv74f/
fonte
Depois de ler todas as respostas aqui - como resumir as informações agrupadas, decidi pular tudo e apenas carreguei uma das bibliotecas javascript do SQL. Estou usando o alasql, sim, leva alguns segundos a mais no tempo de carregamento, mas economiza um tempo incontável na codificação e depuração, agora para agrupar e sum () eu acabei de usar,
Eu sei que isso soa um pouco como um discurso retórico sobre angular / js, mas na verdade o SQL resolveu isso há mais de 30 anos e não deveríamos ter que reinventá-lo em um navegador.
fonte