Улучшить эту документацию Просмотреть исходный код ngModel.NgModelController
- тип в модуле ng
NgModelController предоставляет API для директивы ngModel. Контроллер содержит сервисы для привязки данных, валидации, обновления CSS и форматирования/парсинга значений. Он намеренно не содержит логики, связанной с рендерингом DOM или прослушиванием событий DOM. Такая логика, связанная с DOM, должна предоставляться другими директивами, которые используют NgModelController для привязки данных к элементам управления. Angular предоставляет эту логику DOM для большинства элементов input. В конце этой страницы вы можете найти пример пользовательского элемента управления пример пользовательского элемента управления, который использует ngModelController для привязки к элементам contenteditable.
Методы
-
$render();
Вызывается, когда требуется обновить представление. Ожидается, что пользователь директивы ng-model реализует этот метод.
Метод
$render()вызывается в следующих ситуациях:-
$rollbackViewValue()вызывается. Если мы откатываем значение представления к последнему сохранённому значению, то вызывается$render()для обновления элемента управления вводом. - Значение, на которое ссылается
ng-model, изменяется программно, и значения$modelValueи$viewValueотличаются от предыдущих значений.
Так как
ng-modelне выполняет глубокое наблюдение,$render()вызывается только в том случае, если значения$modelValueи$viewValueфактически отличаются от их предыдущих значений. Если$modelValueили$viewValueявляются объектами (а не строкой или числом), то$render()не будет вызываться, если вы изменяете только свойство объекта. -
-
$isEmpty(value);
Вызывается, когда нам нужно определить, пустое ли значение ввода.
Например, директива required использует этот метод, чтобы определить, содержит ли ввод данные.
По умолчанию функция
$isEmptyпроверяет, является ли значение пустым,undefined,'',nullилиNaN.Вы можете переопределить этот метод для директив ввода, для которых концепция пустого значения отличается от стандартной. Директива
checkboxInputTypeделает это, потому что в её случае значениеfalseозначает пустое значение.Параметры
Параметр Тип Подробности value *Значение ввода, которое нужно проверить на пустоту.
Возвращаемое значение
booleanTrue, если
valueявляется пустым. -
$setValidity(validationErrorKey, isValid);
Изменяет состояние валидности и уведомляет форму.
Этот метод можно вызывать внутри $parsers/$formatters или в реализации пользовательской валидации. Однако в большинстве случаев достаточно использовать коллекции
ngModel.$validatorsиngModel.$asyncValidators, которые автоматически вызовут$setValidity.Параметры
Параметр Тип Подробности validationErrorKey stringИмя валидатора. Ключ
validationErrorKeyбудет назначен либо$error[validationErrorKey], либо$pending[validationErrorKey](для невыполненных$asyncValidators), чтобы его можно было использовать для привязки данных. КлючvalidationErrorKeyдолжен быть в camelCase, и он будет преобразован в dash-case для имени класса. Пример:myErrorприведет к классамng-valid-my-errorиng-invalid-my-error, и к ним можно будет обратиться как к{{someForm.someControl.$error.myError}}.isValid booleanЯвляется ли текущее состояние валидным (true), невалидным (false), ожидающим (undefined) или пропущенным (null). Ожидающее состояние используется для невыполненных
$asyncValidators. Пропущенное состояние используется Angular, когда валидаторы не выполняются из-за ошибок парсинга и когда$asyncValidatorsне выполняются, потому что один из$validatorsне прошёл. -
$setPristine();
Устанавливает поле в первоначальное состояние.
Этот метод можно вызывать, чтобы удалить класс
ng-dirtyи установить поле в первоначальное состояние (классng-pristine). Модель считается первоначальной, когда значение поля не изменялось с момента первоначальной компиляции. -
$setDirty();
Устанавливает поле в грязное состояние.
Этот метод можно вызывать, чтобы удалить класс
ng-pristineи установить поле в грязное состояние (классng-dirty). Модель считается грязной, когда значение поля изменилось с момента первоначальной компиляции. -
$setUntouched();
Устанавливает поле в состояние «нетронутое».
Этот метод можно вызывать, чтобы удалить класс
ng-touchedи установить поле в состояние «нетронутое» (классng-untouched). При компиляции модель по умолчанию устанавливается как «нетронутая», однако эту функцию можно использовать для восстановления этого состояния, если модель уже была затронута пользователем. -
$setTouched();
Устанавливает поле в состояние «затронутое».
Этот метод можно вызывать, чтобы удалить класс
ng-untouchedи установить поле в состояние «затронутое» (классng-touched). Модель считается затронутой, когда пользователь сначала фокусируется на элементе управления, а затем переключает фокус с элемента управления (событие blur). -
$rollbackViewValue();
Отменить обновление и сбросить значение элемента ввода до предотвращения обновления
$modelValue, что может быть вызвано ожидающим отложенным событием или ожиданием события в будущем.Если у вас есть элемент ввода, использующий
ng-model-optionsдля настройки отложенных обновлений или обновлений, зависящих от специальных событий, таких как blur, у вас может возникнуть ситуация, когда$viewValueне синхронизируется со значением$modelValueмодели ngModel.В этом случае вы можете использовать
$rollbackViewValue()для ручного отмены отложенного/будущего обновления и сброса ввода до последнего сохраненного значения представления.Также возможно возникновение трудностей, если вы попытаетесь программно обновить значение
$modelValueмодели ngModel до того, как эти отложенные/будущие события будут обработаны/произойдут, так как механизм проверки на изменения Angular не может определить, действительно ли модель изменилась.Метод
$rollbackViewValue()следует вызывать до програмного изменения модели элемента ввода, у которого могут быть ожидающие события. Это важно для того, чтобы гарантировать, что поле ввода будет обновлено с новым значением модели, и любые ожидающие операции будут отменены. -
$validate();
Выполняет каждый зарегистрированный валидатор (сначала синхронные, а затем асинхронные). Если валидность изменится на невалидную, модель будет установлена в
undefined, еслиngModelOptions.allowInvalidне равенtrue. Если валидность изменится на валидную, она установит модель в последнее доступное валидное$modelValue, т.е. либо последнее разобранное значение, либо последнее значение, установленное из области видимости. -
$commitViewValue();
Зафиксировать ожидающее обновление
$modelValue.Обновления могут ожидать из-за отложенного события или ожидания события в будущем, определённого в
ng-model-options. Этот метод редко необходим, так какNgModelControllerобычно обрабатывает вызов этого метода в ответ на события ввода. -
$setViewValue(value, trigger);
Обновить значение представления.
Этот метод должен вызываться, когда элемент управления хочет изменить значение представления; обычно это делается из обработчика событий DOM. Например, директива input вызывает его, когда значение элемента ввода изменяется, а директива select — когда выбирается элемент.
При вызове
$setViewValue, новое значениеvalueбудет подготовлено к фиксации через конвейеры$parsersи$validators. Если не указаны специальные параметрыngModelOptions, то подготовленное значение отправляется непосредственно на обработку, в конечном счёте применяется к$modelValueи затем к выражению, указанному в атрибутеng-model. Наконец, вызываются все зарегистрированные обработчики изменений в списке$viewChangeListeners.В случае использования директивы ngModelOptions с
updateOnи триггеромdefaultне в списке, все эти действия останутся в ожидании до тех пор, пока одно из событийupdateOnне будет выполнено в элементе DOM. Все эти действия будут отложены, если директива ngModelOptions используется с настраиваемым отложенным выполнением для конкретного события. Обратите внимание, что событие$digestсрабатывает только после того, как событияupdateOnбыли выполнены или если заданdebounce, после истечения таймера.При использовании со стандартными элементами ввода значение представления всегда будет строкой (которая в некоторых случаях преобразуется в другой тип, например, в объект
Dateдляinput[date]). Однако пользовательские элементы управления также могут передавать объекты в этот метод. В этом случае следует скопировать объект перед передачей его в$setViewValue. Это связано с тем, чтоngModelне выполняет глубокого наблюдения за объектами, а только проверяет изменение идентичности. Если вы изменяете только свойство объекта, ngModel не распознает, что объект изменился, и не вызовет конвейеры$parsersи$validators. По этой причине вы не должны изменять свойства копии после того, как она была передана в$setViewValue. В противном случае вы можете неверно изменить значение модели в области видимости.В любом случае, переданное в метод значение должно всегда отражать текущее значение элемента управления. Например, если вы вызываете$setViewValueдля элемента ввода, вы должны передать значение элемента ввода DOM. В противном случае, элемент управления и модель области видимости не будут синхронизированы. Также важно отметить, что$setViewValueне вызывает$renderили не изменяет значение DOM элемента управления каким-либо образом. Если нам нужно программно изменить значение DOM элемента управления, мы должны обновить выражение области видимостиngModel. Его новое значение будет получено контроллером модели, который выполнит его через$formatters, применит его для обновления DOM и, наконец, вызовет$validateна нём.Параметры
Параметр Тип Подробности value *значение из представления.
trigger stringСобытие, которое вызвало обновление.
Свойства
-
Значение представления
*Фактическое значение из представления элемента управления. Для элементов
inputэто строка. См.ngModel.NgModelControllerдля получения информации о том, когда устанавливается значение $viewValue. -
Значение модели
*Значение в модели, к которой привязан элемент управления.
-
$parsers
Array.<Function>Массив функций, выполняемых поэтапно, всякий раз, когда элемент управления считывает значение из DOM. Функции вызываются в порядке массива, и каждая функция передает своё возвращаемое значение следующей функции. Последнее возвращаемое значение передаётся в коллекцию
$validators.Парсеры используются для очистки/преобразования
$viewValue.Возвращение
undefinedпарсером означает ошибку разбора. В этом случае не будут выполняться$validators, и значениеngModelбудет установлено вundefined, если не установленоngModelOptions.allowInvalidв значениеtrue. Ошибка разбора сохраняется вngModel.$error.parse. -
$formatters
Array.<Function>Массив функций, выполняемых поэтапно, всякий раз, когда значение модели изменяется. Функции вызываются в обратном порядке массива, и каждая функция передаёт значение следующей функции. Последнее возвращаемое значение используется в качестве фактического значения DOM. Используется для форматирования/преобразования значений для отображения в элементе управления.
function formatter(value) { if (value) { return value.toUpperCase(); } } ngModel.$formatters.push(formatter); -
$validators
Object.<string, function>Коллекция валидаторов, которые применяются всякий раз, когда изменяется значение модели. Значение ключа в объекте относится к имени валидатора, а функция относится к операции валидации. Операция валидации получает значение модели в качестве аргумента и должна возвращать значение true или false в зависимости от результата валидации.
ngModel.$validators.validCharacters = function(modelValue, viewValue) { var value = modelValue || viewValue; return /[0-9]+/.test(value) && /[a-z]+/.test(value) && /[A-Z]+/.test(value) && /\W+/.test(value); }; -
$asyncValidators
Object.<string, function>Коллекция валидаций, которые должны выполнять асинхронную валидацию (например, HTTP-запрос). Функция валидации, которая предоставляется, должна возвращать обещание при выполнении процесса валидации модели. После получения обещания статус валидации устанавливается в true при выполнении и в false при отклонении. При запуске асинхронных валидаторов каждая из них выполняется параллельно, и значение модели обновляется только после выполнения всех валидаторов. Пока асинхронный валидатор не выполнен, его ключ добавляется в свойство
$pendingконтроллера. Кроме того, все асинхронные валидаторы будут выполняться только после успешного прохождения всех синхронных валидаторов.Обратите внимание, что если используется $http, то для выполнения валидации важно, чтобы сервер возвращал успешный HTTP-код ответа, а для отклонения валидации — статус
4xx.ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) { var value = modelValue || viewValue; // Lookup user by username return $http.get('/api/users/' + value). then(function resolved() { //username exists, this means validation fails return $q.reject('exists'); }, function rejected() { //username does not exist, therefore this validation passes return true; }); }; -
$viewChangeListeners
Array.<Function>Массив функций, которые выполняются всякий раз, когда изменяется значение представления. Он вызывается без аргументов, и его возвращаемое значение игнорируется. Это можно использовать вместо дополнительных $watches по отношению к значению модели.
-
$error
ObjectХеш-объект с идентификаторами всех не прошедших валидаций в качестве ключей.
-
$pending
ObjectХеш-объект с идентификаторами всех ожидающих валидаторов в качестве ключей.
-
$untouched
booleanTrue, если элемент управления ещё не потерял фокус.
-
$touched
booleanTrue, если элемент управления потерял фокус.
-
$pristine
booleanTrue, если пользователь ещё не взаимодействовал с элементом управления.
-
$dirty
booleanTrue, если пользователь уже взаимодействовал с элементом управления.
-
$valid
booleanTrue, если нет ошибок.
-
$invalid
booleanTrue, если есть хотя бы одна ошибка в элементе управления.
-
$name
stringАтрибут name элемента управления.
В этом примере показано, как использовать NgModelController с пользовательским элементом управления для достижения привязки данных. Обратите внимание, как разные директивы (contenteditable, ng-model, и required ) взаимодействуют друг с другом для достижения желаемого результата.
contenteditable - это атрибут HTML5, который сообщает браузеру, что содержимое элемента может быть изменено пользователем прямо на странице.
Здесь используется служба $sce и модуль $sanitize для автоматической удаления «плохого» содержимого, такого как встроенные обработчики событий (например, <span onclick="...">). Однако, поскольку используется $sce, модель всё ещё может предоставить небезопасное содержимое, если отметит это содержимое с помощью службы $sce.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.4.14/docs/api/ng/type/ngModel.NgModelController