2013-11-06 4 views
12

У меня есть поле ввода в форме с некоторыми валидациями. Отлично работает.Получите «сырое» значение из недопустимого поля ввода

Это в основном выглядит следующим образом:

<input 
    class="form-control" 
    type="number" 
    ng-model="zipcode" 
    ng-minlength="5" 
    ng-maxlength="5" 
    id="zipcode" 
    name="zipcode" 
    required 
> 

Рабочий plunkr здесь: http://plnkr.co/edit/H0h59kG75T5MGE9cAhSo?p=preview

Но теперь я хочу, чтобы реагировать на каждое изменение входного сигнала - будь то действительным или нет. Так, например, если поле ввода содержит «123», оно недействительно и значение не передается моей модели - это прекрасно. Но я все же хочу получить значение, чтобы сделать некоторые промежуточные запросы в веб-сервисе.

Любые идеи?

+0

Я думаю, что вы будете иметь, чтобы справиться мин и макс в контроллере, чтобы получить эту работу. –

ответ

6

Вот что я придумал для вашего сценария.

В принципе вы можете написать директиву, которая требует ngModel (ngModelController). NgModelController имеет массив парсеров, который он вызывает для синтаксического анализа значения вида в конвейере. Если проверка не прошла, эти синтаксические анализаторы не обновляют модель. Если вы вводите пользовательский парсер в начале массива парсеров, вы можете получить каждое значение изменения вида и делать с ним все, что хотите.

Смотрите мой plunkr здесь http://plnkr.co/edit/ruB42xHWj7dBxe885OGy?p=preview (см консоль)

Основной код будет

ngModelCtrl.$parsers.splice(0,0,(function (viewValue) { 
       console.log("The view value is:"+viewValue) 
       return viewValue;   
      })); 

Также см ngModelController documenation

+0

Спасибо вам большое за очень быстрый ответ. Также: работает как шарм;) – sne11ius

+0

Еще раз спасибо. ИМО ваш ответ был хорошо стоит сообщение в блоге, так что вот оно: http://wasis.nu/mit/blog?postId=527aafe9975ab23791ba6da8 – sne11ius

+0

Отлично! Я тоже думал то же самое. Я посмотрел ваш пост, и вы улучшили эту реализацию. – Chandermani

12

Сначала вызовите элемент формы в контроллере, а затем использовать атрибут $viewValue :

Вид:

<form name="form"> 
<input 
    ... 
    ng-model="zipcode" 
    ng-change="getRawValue(form)" 
    name="zipcode" 
    required 
> 
</form> 

Контроллер:

$scope.getRawValue = function(form) { 
    var rawValue = form.zipcode.$viewValue; 
} 
+3

Это должен быть правильный ответ ИМО. Это намного проще и не требует директивы. –

+1

Jay, спасибо! Просто нужно «form.zipcode. $ ViewValue» .. простое решение! – EscapeNetscape

+0

Это работает, отлично! –

8

Угловая 1,3 представил реальный ответ на это: allowInvalid в ngModelOptions.

Пример:

<input 
    type="text" 
    name="userName" 
    ng-model="user.name" 
    ng-model-options="{allowInvalid: true}" 
> 
+0

Это, ИМО, является самым чистым способом работы с недопустимым значением. Для этого не требуется директива или даже специальная функция для работы с ней. Просто отбросьте это, и это сработает. –

Смежные вопросы