Улучшить документацию Посмотреть исходный код 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 *Значение поля ввода, проверяемое на пустоту.
Возвращаемое значение
booleanИстина, если
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не синхронизируется с$modelValuengModel.В этом случае вы можете использовать
$rollbackViewValue()для ручного отмены отложенного/будущего обновления и сброса ввода до последнего сохранённого значения представления.Также возможно возникновение проблем, если вы попытаетесь программно обновить
$modelValuengModel до того, как эти отложенные/будущие события будут разрешены/произойдут, так как механизм проверки на изменения 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–2020 Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
https://code.angularjs.org/1.8.2/docs/api/ng/type/ngModel.NgModelController