Angular2 ngModel изменяет привязку к типу ввода = «число»

#javascript #angular #input #typescript #ngmodel

#javascript #угловой #ввод #машинописный текст #ngmodel

Вопрос:

У меня есть ввод типа числа, и когда я пытаюсь изменить значение с помощью события onChange, оно не работает.

Я пробовал то же самое для ввода текста, и он работает отлично.

 <input
   type="number"
   [(ngModel)]="element.value" 
   (change)="onChange($event)"
   >

export class NumFieldComponent {
    @Input() index;
    @Input() element; //element.value = 0

    onChange($event){

        var confirm = confirm("Are you sure about this?")

        if(confirm){
            //True, accept the value
        } else {
            this.element.value = 0;
            //Failed, set the input back to 0
        }
    }
}
  

Я новичок в Angular2, так чего же мне здесь не хватает?

PS. Я видел аналогичную проблему с входными данными, которые принимают bools

Комментарии:

1. что за журнал?

2. Я не уверен, что вы имеете в виду?

3. Я тоже не смог заставить это работать. То, что я сделал, изменило мой ввод на type="tel"

4. в чем именно ошибка? консоль браузера запускает какую-либо ошибку?

5. ошибок вообще нет, событие изменения срабатывает нормально, и установка значения работает нормально. Пользовательский интерфейс просто не отражает значение, устанавливаемое из функции изменения

Ответ №1:

переход на одностороннюю привязку сработал для меня, и проще не запускать изменение, если пользователь тоже отменяет (обратите внимание, что мне все равно пришлось вручную обновлять DOM, как вы видите):

 <input
   type="number"
   [ngModel]="element.value"   // one way binding
   (change)="onChange($event)"
   >

export class NumFieldComponent {
    @Input() index;
    @Input() element; //element.value = 0

    onChange($event){

        var confirm = confirm("Are you sure about this?")

        if(confirm){
            this.element.value = $event.target.value
        } else {
            $event.target.value = 0;
            //Failed, set the input back to 0
        }
    }
}
  

Ответ №2:

Не пробовал, но может сработать

 export class NumFieldComponent {
    @Input() index;
    @Input() element; //element.value = 0

    constructor(cdRef:ChangeDetectorRef) {}

    onChange($event){

        var confirm = confirm("Are you sure about this?")

        if(confirm){
            //True, accept the value
        } else {
            this.element.value = 0;
            this.cdRef.detectChanges(); // <<<=== added
            //Failed, set the input back to 0
        }
    }
}
  

Комментарии:

1. Это сработало. Это обходной путь для ошибки в angular2.0.0 или есть причина, по которой привязка изменений работает с type=»text» и не работает с type =»number»?

2. Я не думаю, что это ошибка. Возможно, это проблема времени. Для нескольких привязок событий не указан порядок выполнения, как в вашем ( (ngModel) и (change) ). Вы также можете попробовать, работает ли это по-другому, когда вы используете (ngModelChange)="..." вместо (change)="..." .

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

4. Я признаю, что это звучит странно. Какой браузер вы используете?

5. Версия Chrome 53.0.2785.143 (64-разрядная) OSX