Я хочу вычислить и показать 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
.
Проблема в порядке атрибутов. Ваше (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;
Спасибо, но это не сработало. Я обновил свой вопрос. Пожалуйста, проверьте.
Я получаю эту ошибку, когда удаляю эту строку: error TS2532: Object is possibly 'undefined'. 44 this.expense.totalAmount = this.expense.quantity>1?(this.expense.amount||0)*(this.expense.quantity||0):this.expense.amount;
@ElaineByene обновила мой ответ
Огромное спасибо :) Раньше я никогда не знала о двойном ??
.
Это потому, что вы всегда устанавливаете количество равным 1 перед расчетом общей суммы, независимо от того, что было введено!