Улучшить документацию Просмотреть исходный код ngModel.NgModelController
- тип в модуле ng
Обзор
NgModelController предоставляет API для директивы ngModel. Контроллер содержит сервисы для привязки данных, валидации, обновлений CSS и форматирования и разбора значений. Он намеренно не содержит никакой логики, связанной с рендерингом DOM или прослушиванием событий DOM. Такая логика, связанная с DOM, должна предоставляться другими директивами, которые используют NgModelController для привязки данных к элементам управления. AngularJS предоставляет эту логику 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является "пустым". -
$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не синхронизирован со значением ngModel$modelValue.В этом случае вы можете использовать
$rollbackViewValue()для ручного отмены отложенного/будущего обновления и сброса ввода до последнего сохраненного значения представления.Также возможно, что у вас возникнут трудности, если вы попытаетесь программно обновить значение ngModel
$modelValueперед тем, как эти отложенные/будущие события будут обработаны/произойдут, так как механизм проверки на изменения AngularJS не может определить, действительно ли модель изменилась или нет.Метод
$rollbackViewValue()должен вызываться перед программно изменением модели ввода, у которого могут быть такие события в ожидании. Это важно, чтобы гарантировать, что поле ввода будет обновлено с новым значением модели, и любые ожидающие операции будут отменены.Пример
-
$validate();
Выполняет каждый из зарегистрированных валидаторов (сначала синхронных, а затем асинхронных). Если валидность изменится на недействительную, модель будет установлена в
undefined, еслиngModelOptions.allowInvalidнеtrue. Если валидность изменится на действительную, она установит модель в последнее доступное действительное значение$modelValue, т.е. последнее проанализированное значение или последнее значение, заданное из области видимости. -
$commitViewValue();
Зафиксировать ожидающее обновление
$modelValue.Обновления могут быть в ожидании из-за отложенного события или потому, что ввод ожидает некоторое будущее событие, определенное в
ng-model-options. Этот метод редко нужен, посколькуNgModelControllerобычно обрабатывает вызов этого в ответ на события ввода. -
$setViewValue(value, trigger);
Обновить значение представления.
Этот метод следует вызывать, когда элемент управления хочет изменить значение представления; как правило, это делается внутри обработчика событий DOM. Например, директива input вызывает его, когда меняется значение ввода, а select — когда выбирается опция.
Когда
$setViewValueвызывается, новоеvalueбудет поставлено в очередь для фиксации через$parsersи$validatorsконвейеры. Если не указаны особыеngModelOptions, то поставленное значение отправляется непосредственно на обработку через$parsersконвейер. После этого вызываются$validatorsи$asyncValidators, и значение применяется к$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,$renderдля обновления DOM и, наконец, вызовет$validateна нём.Параметры
Параметр Тип Подробности value *значение из представления.
trigger stringСобытие, которое вызвало обновление.
-
$overrideModelOptions(options);
Программно переопределить текущие параметры модели.
Предыдущее значение
ModelOptionsне будет изменено. Вместо этого новый объектModelOptionsунаследует свойства от предыдущего, переопределяя или наследуя настройки, определённые в переданном параметре.См.
ngModelOptionsдля информации о том, какие параметры можно указать и как работает наследование параметров модели.Примечание: эта функция влияет только на параметры, установленные наngModelController, а не на параметры директивыngModelOptions, из которых они могли быть изначально получены.Примечание: невозможно переопределить параметрgetterSetter.Параметры
Параметр Тип Подробности options Objectсловарь настроек для переопределения предыдущих параметров
-
$processModelValue();
Выполняет обработку цепочки модель -> представление для текущего $modelValue.
Этот метод выполняет следующие действия:
- значение
$modelValueпроходит через $formatters, и результат устанавливается в $viewValue - на элементе устанавливается класс
ng-emptyилиng-not-empty - если значение
$viewValueизменилось:- $render вызывается для управления
- $validators запускаются, и статус валидации устанавливается.
Этот метод вызывается внутри ngModel при изменении значения связанного скоупа. Разработчикам приложений обычно не нужно вызывать эту функцию самостоятельно.
Эту функцию можно использовать, когда значение
$viewValueили рендерленное значение DOM не отформатированы корректно, и$modelValueнужно снова обработать через$formattersПример
Представьте текстовое поле с автодополнением (для фруктов), где элементы — это объекты с именем и идентификатором. Пользователь вводит
apи затем выбираетApricotиз списка. На основании этого виджет автодополнения вызовет$setViewValue({name: 'Apricot', id: 443}), но отображаемое значение по-прежнему будетap. Затем виджет может вызватьctrl.$processModelValue(), чтобы повторно запустить цепочку модель -> представление, которая отформатирует объект в строкуApricot, обновит$viewValue, и, наконец, отобразит её в DOM. - значение
-
$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. Пропущенное состояние используется AngularJS, когда валидаторы не выполняются из-за ошибок разбора, и когда$asyncValidatorsне выполняются, потому что какой-либо из$validatorsне прошёл.
Свойства
-
$viewValue
*Фактическое значение из представления элемента управления. Для элементов
inputэто строка. См.ngModel.NgModelControllerдля информации о том, когда устанавливается $viewValue. -
$modelValue
*Значение в модели, к которой привязано поле.
-
$parsers
Array.<Function>Массив функций, которые выполняются как конвейер всякий раз, когда элемент управления обновляет ngModelController новым
$viewValueиз DOM, обычно через пользовательский ввод. См.$setViewValue()для подробного объяснения жизненного цикла. Обратите внимание, что$parsersне вызываются, когда связанное выражение ngModel изменяется программно.Функции вызываются в порядке массива, и каждая функция передает свое возвращаемое значение следующей функции. Последнее возвращаемое значение передается в коллекцию
$validators.Парсеры используются для очистки/преобразования
$viewValue.Возвращение
undefinedиз парсера означает, что произошла ошибка разбора. В этом случае не будет выполнено ни одно$validators, иngModelбудет установлено вundefined, если не заданngModelOptions.allowInvalidв значенииtrue. Ошибка разбора хранится вngModel.$error.parse.Этот простой пример показывает парсер, который преобразует значение входного текстового поля в нижний регистр:
function parse(value) { if (value) { return value.toLowerCase(); } } ngModelController.$parsers.push(parse); -
$formatters
Array.<Function>Массив функций, которые выполняются как конвейер, когда связанное выражение ngModel изменяется программно.
$formattersне вызываются, когда значение элемента управления изменяется пользователем.Форматтеры используются для форматирования/преобразования
$modelValueдля отображения в элементе управления.Функции вызываются в обратном порядке массива, и каждая функция передает значение следующей функции. Последнее возвращаемое значение используется в качестве фактического значения DOM.
Этот простой пример показывает форматтер, который преобразует значение модели в верхний регистр:
function format(value) { if (value) { return value.toUpperCase(); } } ngModel.$formatters.push(format); -
$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>Массив функций, которые выполняются всякий раз, когда изменение
$viewValueвызвало изменение$modelValue. Он вызывается без аргументов, и его возвращаемое значение игнорируется. Это может быть использовано вместо дополнительных $watch против значения модели. -
$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–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.6.9/docs/api/ng/type/ngModel.NgModelController