Элемент управления, привязанный к модели, показывает старое значение для определенных ключей, несмотря на то, что свойство get () работает в Angular - PullRequest
0 голосов
/ 05 мая 2019

Прежде всего, извините за загадочный вопрос. Я с удовольствием обновлю, если кто-то предложит что-нибудь получше. Возможно, моя диагностика не очень хорошо направлена.

У меня есть класс конфигурации с полем. К этому полю привязано поле ввода, и, поскольку требование немного сложное, я реализовал для него методы 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...