2015-11-04 3 views
0

Очевидно, что некоторые браузеры позволяют пользователям набирать буквы в числовом поле ввода (например, Chrome 46.0.2490.80 на Mac или Chrome 41.0.2272.89 на Ubuntu). Кроме того, все браузеры принимают символ «е», так как в некоторых конкретных условиях его можно считать допустимым числом.Номер типа входного сигнала AngularJS не обновляет модель при вводе букв

Теперь, по-видимому, Angular не может обновить модель, если пользователь вводит любые буквы в этом поле.

Вы можете видеть, что в этой скрипке: http://jsfiddle.net/Y8Jg6/78/

<h1>Simple Data Binding with AngularJS</h1> 
<br /> 
<div ng-app> 
Name: <input type="number" ng-model="name" /> 
<br /><br /> 
    Welcome to AngularJS {{name}} 
</div> 

Является ли это ожидаемое поведение? Таким образом, существуют моменты, когда модель не отражает значение поля ввода и может привести к непредвиденным ошибкам (например, я думаю о полевой проверке)

ответ

1

Это работает, как ожидалось, только когда вход данные достоверны модель обновляется

Вы можете быть в состоянии изменить это поведение с ngModelOptions: {allowInvalid: истинно} (не работает для входного типа = число AFAIK)

документов: https://docs.angularjs.org/api/ng/directive/ngModelOptions

Также см. этот вопрос: How can I override Angular's filtering of invalid form values, forcing Angular to persist the $viewValue to $modelValue?

2

Если вы ожидаете число, то любые буквы в этом поле делают значение модели недействительным (если, конечно, не упоминается «e»). Угловая 1.4.x использует это регулярное выражение, чтобы определить, является ли число разрешено или нет:

var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; 

Как вы можете видеть, «е» или «Е», действует в этом случае (но никакие другие буквы не являются). Ваш jsfiddle использует более раннюю версию углового, где символ «e», кажется, не правильно разбирается и поэтому делает модель недействительной. Вот то же самое: jsfiddle, используя Angular 1.4.7, где он правильно анализирует число (те, которые содержат e или E).

Ваше приложение предположительно использует проверку, чтобы определить, что модель заполнена, если она фактически является обязательным полем. Если вы действительно хотите, чтобы в вашей модели не было числовых чисел, рассмотрите другой «тип» на входе.