Прежде всего, извините за загадочный вопрос. Я с удовольствием обновлю, если кто-то предложит что-нибудь получше. Возможно, моя диагностика не очень хорошо направлена.
У меня есть класс конфигурации с полем. К этому полю привязано поле ввода, и, поскольку требование немного сложное, я реализовал для него методы get
и set
. Дизайн выглядит следующим образом.
export class RowConfig {
constructor(public amount = 0, ...) { }
get rendition() {
let output = "";
if (this.amount !== null && this.amount !== undefined)
output = ("" + this.amount)
.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1 ");
console.log("rendition GET: " + this.amount + " -> " + output);
return output;
}
set rendition(input: string) {
console.log("rendition SET: " + input);
const negative = input.match(/^[-]/);
const digits = input.replace(/\D/g, "");
let output = null;
if (digits)
output = +digits * (negative ? -1 : 1);
this.amount = output;
console.log("rendition ACT: " + output);
}
}
Сначала я предположил, что это что-то с регулярным выражением (а это не так). Тогда я решил, что моя модель связана таким образом, что get rendition()
служит неверным значением (а это не так). Очевидно, что логика в классе работает так, как должно. Однако, когда я ввожу 12345W , нецифровый символ остается в поле ввода! В консоли видно, что полученная строка 12345W преобразуется и сохраняется как число 12345 . Я также вижу в консоли, что возвращаемое значение равно 12 345 , включая пробел, как и предполагалось.
Тем не менее, значение в поле показывает W , и я не могу понять, почему. Когда я в конце концов нажимаю цифровую клавишу, элемент управления обновляется, как и ожидалось, и нецифровка удаляется. Так запутался здесь ...
<input #amount
type="text"
(keyup)="onKeyUp($event)"
placeholder="xxx" [(ngModel)]="config.rendition">
Я пытался действовать на keyup
, предотвращая настройки по умолчанию и останавливая распространение. Я попытался просто найти логику для того, когда менять значения. Я не вижу, где я иду не так. Единственное подозрительное, что я заметил, это то, что get rendition()
вызывается дважды до и дважды после вызова set rendition()
(нет, это говорит мне о многом, и я могу себе представить, что это как-то связано с угловым пузырем событий).
Так что в этот момент я утверждаю, что это магия, черный вид. И я буду очень доволен, если кто-то докажет, что я не прав в этом милом Blitzy .