В приведенном ниже скрипте отображается корзина, в которой используется ng-repeat
. Для каждого элемента в массиве отображается имя элемента, его количество и промежуточный итог ( product.price * product.quantity
).
Как проще всего рассчитать общую стоимость повторяющихся элементов?
<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
сохранять персик
источник
источник
Ответы:
В шаблоне
В контроллере
источник
Это также работает как с фильтром, так и с обычным списком. Первым делом нужно создать новый фильтр для суммы всех значений из списка, а также дать решение для суммы общего количества. В деталях кода проверьте ссылку на скрипач .
проверьте эту ссылку на скрипку
источник
'undefined'
когда используюresultValue
, но если я используюitems
его, все работает нормально, любые идеи .. ??items
не будет работать с фильтрами, помогите!ng-repeat="campaign in filteredCampaigns=(campaigns | filter:{'name':q})"
и{{ filteredCampaigns | campaignTotal: 'totalCommission' | number: 2 }}
Понимая, что это ответил давно, но хотел опубликовать другой подход, не представленный ...
Используйте,
ng-init
чтобы подсчитать общую сумму. Таким образом, вам не нужно выполнять итерацию в HTML и итерацию в контроллере. В этом сценарии я думаю, что это более чистое / простое решение. (Если бы логика подсчета была более сложной, я определенно рекомендовал бы перенести логику на контроллер или службу, если это необходимо.)Конечно, в вашем контроллере просто определите / инициализируйте свое
Total
поле:источник
Вы можете рассчитать общую сумму внутри
ng-repeat
следующего:Проверьте результат здесь: http://plnkr.co/edit/Gb8XiCf2RWiozFI3xWzp?p=preview
В случае результата автоматического обновления: http://plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p=preview (Спасибо - VicJordan)
источник
tbody
инициализируется только один раз, ноtr
каждый раз, когда список фильтруется, что приводит к неправильной сумме$scope
Это мое решение
сладкий и простой настраиваемый фильтр:
(но относится только к простой сумме значений, а не к сумме произведений, я создал
sumProduct
фильтр и добавил его как правку к этому сообщению).JS Fiddle
РЕДАКТИРОВАТЬ: sumProduct
Это
sumProduct
фильтр, он принимает любое количество аргументов. В качестве аргумента он принимает имя свойства из входных данных и может обрабатывать вложенное свойство (вложенность отмечена точкой :)property.nested
;вот JS Fiddle и код
JS Fiddle
источник
Простое решение
Вот простое решение. Дополнительного цикла for не требуется.
HTML часть
Часть сценария
источник
Другой способ решения этой проблемы, расширяющий ответ Вацлава на решение этого конкретного вычисления, то есть вычисление для каждой строки.
Чтобы сделать это с расчетом, просто добавьте функцию расчета в свою область видимости, например
Вы бы использовали
{{ datas|total:calcItemTotal|currency }}
в своем HTML-коде. Преимущество этого метода заключается в том, что он вызывается не для каждого дайджеста, поскольку использует фильтры и может использоваться для простых или сложных итогов.JSFiddle
источник
Это простой способ сделать это с помощью ng-repeat и ng-init для агрегирования всех значений и расширения модели с помощью свойства item.total.
Директива ngInit вызывает функцию set total для каждого элемента. Функция setTotals в контроллере вычисляет общую сумму каждого элемента. Он также использует переменные области invoiceCount и invoiceTotal для агрегирования (суммирования) количества и итога для всех элементов.
для получения дополнительной информации и демонстрации перейдите по этой ссылке:
http://www.ozkary.com/2015/06/angularjs-calculate-totals-using.html
источник
Предпочитаю элегантные решения
В шаблоне
В контроллере
Если вы используете ES2015 (он же ES6)
источник
Вы можете использовать настраиваемый фильтр Angular, который берет массив объектов набора данных и ключ в каждом объекте для суммирования. Затем фильтр может вернуть сумму:
Затем в вашей таблице для суммирования столбца вы можете использовать:
источник
Вы можете попробовать использовать сервисы angular js, у меня это сработало .. приведя фрагменты кода ниже
Код контроллера:
Сервисный код:
источник
вот мое решение этой проблемы:
сценарий
reduce будет выполняться для каждого продукта в массиве продуктов. Accumulator - это общая накопленная сумма, currentValue - это текущий элемент массива, а 0 в последнем - это начальное значение.
источник
Я немного расширил ответ Раджа Шилпы. Вы можете использовать такой синтаксис:
так что вы можете получить доступ к дочернему объекту объекта. Вот код фильтра:
источник
Взяв ответ Вацлава и сделав его более похожим на Angular:
Это дает вам преимущество даже при доступе к вложенным данным и данным массива:
источник
В html
в javascript
источник
Ответ Хая Нгуена почти готов. Чтобы он заработал, добавьте:
... в строку с ng-init. В списке всегда есть один элемент, поэтому Angular повторит блок ровно один раз.
Демо Zybnek с использованием фильтрации можно заставить работать, добавив:
См. Http://plnkr.co/edit/dLSntiy8EyahZ0upDpgy?p=preview .
источник
источник
Это мое решение
Это требует, чтобы вы добавили имя в контроллер,
Controller as SomeName
чтобы мы могли кэшировать переменную там (действительно ли это требуется? Я не знаком с использованием $ parent, поэтому не знаю)Затем для каждого повтора добавляйте
ng-init"SomeName.SumVariable = ($first ? 0 : SomeName.SumVariable) + repeatValue"
$first
для проверки сначала он сбрасывается до нуля, иначе он продолжит агрегированное значениеhttp://jsfiddle.net/thainayu/harcv74f/
источник
Прочитав здесь все ответы - как обобщить сгруппированную информацию, я решил пропустить все это и просто загрузил одну из библиотек SQL javascript. Я использую alasql, да, время загрузки занимает на несколько секунд больше, но экономит бесчисленное количество времени при кодировании и отладке. Теперь для группировки и sum () я просто использую,
Я знаю, что это звучит как напыщенная речь об angular / js, но на самом деле SQL решил это более 30 лет назад, и нам не нужно заново изобретать его в браузере.
источник