Умножьте 2 поля ввода и покажите общую сумму в другом поле ввода

Я хочу вычислить и показать totalAmount при вводе Amount и Quantity.

Я использую (keyup) в expense.amount, так как хочу показать как есть в expense.totalAmount. При использовании (ngModelChange) сумма по какой-то причине отображается неправильно.

Я хочу, чтобы calcAmount() начинался только в том случае, если quantity изменено.

Вот мой обновленный HTML:

<div class = "col-auto">
  <label for = "charges">Amount</label>
  <input type = "number" [(ngModel)] = "expense.amount" (keyup) = "calcQuantity()" >
</div>
<div class = "col-auto">
  <label for = "quantity">Qty</label>
  <input type = "number" [(ngModel)] = "expense.quantity" (ngModelChange) = "calcQuantity()">
</div>
<div class = "col-auto">
  <label for = "totalAmount">Total</label>
  <input type = "number" [(ngModel)] = "expense.totalAmount">
</div>

Вот мой файл TS:

calcQuantity() {
  this.expense.quantity = 1;
  this.expense.totalAmount = this.expense.quantity>1?(this.expense.amount||0)*(this.expense.quantity||0):this.expense.amount;
}

Что происходит: Когда я ввожу 100 в amount, он показывает 100 в totalAmount. Я хочу, чтобы это было так. Quantity по умолчанию — 1.

Проблема: Если я изменю Quantity с 1 на 5, totalAmount останется 100. Должно быть 500.

Это потому, что вы всегда устанавливаете количество равным 1 перед расчетом общей суммы, независимо от того, что было введено!

JSON Derulo 26.07.2024 08:57
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в порядке атрибутов. Ваше (ngModelChange) событие срабатывает раньше [(ngModel)]. Это означает, что внутри вашей функции calcQuantity() атрибут this.expense.quantity по-прежнему сохраняет старое значение. Также после выполнения этой функции [(ngModel)] устанавливает вновь введенное значение. Для получения дополнительной информации см. этот выпуск GitHub: https://github.com/angular/angular/issues/11234

Решение состоит в том, чтобы переместить событие (ngModelChange) после [(ngModel)]:

<input type = "number" [(ngModel)] = "expense.quantity" (ngModelChange) = "calcQuantity()">

Также вы всегда устанавливаете количество равным 1 перед расчетом общей суммы, независимо от того, какое количество было введено пользователем. Чтобы гарантировать, что значение не является нулевым или неопределенным, вы можете использовать нулевой оператор объединения (оператор ??=), чтобы установить значение по умолчанию в этом случае:

this.expense.quantity ??= 1;

Спасибо, но это не сработало. Я обновил свой вопрос. Пожалуйста, проверьте.

Elaine Byene 26.07.2024 08:55

Я получаю эту ошибку, когда удаляю эту строку: error TS2532: Object is possibly 'undefined'. 44 this.expense.totalAmount = this.expense.quantity>1?(this.expense.amount||0)*(this.expen‌​se.quantity||0):this‌​.expense.amount;

Elaine Byene 26.07.2024 09:00

@ElaineByene обновила мой ответ

JSON Derulo 26.07.2024 09:04

Огромное спасибо :) Раньше я никогда не знала о двойном ??.

Elaine Byene 26.07.2024 09:14

Другие вопросы по теме