#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