Получить "сырое" значение из недопустимого поля ввода

У меня есть поле ввода в форме с некоторыми валидациями. Он работает как шарм.

В основном это выглядит так:

<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", оно недействительно и значение не передается моей модели - это прекрасно. Но я все же хочу получить значение для выполнения промежуточных запросов к веб-сервису.

Любые идеи?

Ответ 1

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

В принципе вы можете написать директиву, которая требует 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

Ответ 2

Сначала вызовите элемент формы в вашем контроллере, затем используйте атрибут $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

Angular 1.3 представил реальный ответ для этого: allowInvalid в ngModelOptions.

Пример:

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