код:
<input type="text" ng-modal="name" />
{{name}}
Когда я ввожу что-то в input
, следующее {{name}}
будет немедленно изменено. Может ли он сконфигурировать его, только обновить name
после ввода всех символов и оставить вход?
код:
<input type="text" ng-modal="name" />
{{name}}
Когда я ввожу что-то в input
, следующее {{name}}
будет немедленно изменено. Может ли он сконфигурировать его, только обновить name
после ввода всех символов и оставить вход?
Обновление
Как уже упоминалось, Angular теперь имеет встроенную поддержку для этого, используя директиву ng-model-options
. Подробнее здесь.
<input type="text" ng-model="name" ng-model-options="{updateOn: 'blur'}" />
Старый ответ ниже:
Нет встроенной опции для ng-модели, чтобы изменить это поведение, но вы можете написать свою собственную директиву. @Gloopy написал такую директиву для другого вопроса. Вы можете посмотреть на скрипку здесь.
Директива отменяет регистрацию событий input
и keydown
, которые запускают обновление после каждого нажатия клавиши.
<input type="text" ng-model="name" ng-model-onblur />
Update:
Обновлен скрипт для использования последней стабильной версии AngularJS (1.2.16 на момент написания) вместо прямого ссылки на главную версию в github.
Также добавлен явный приоритет, чтобы директива запускалась после ng-model
, чтобы обеспечить корректное изменение прослушивателей событий.
Это касается недавних дополнений к AngularJS, чтобы служить в качестве будущего ответа.
Angular более новые версии (теперь в 1.3 beta), AngularJS поддерживает эту опцию, используя ngModelOptions
, например
ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"
Пример:
<input type="text" name="username"
ng-model="user.name"
ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />
Лучше использовать ng-model-options:
<input type="text" ng-model="name" ng-model-options="{updateOn: 'blur'}" />
Рабочий директивный код (ng-1.2RC3):
использовать: ng-model-onblur
.directive('ngModelOnblur', function () {
return {
restrict: 'A',
require: 'ngModel',
priority: 1,
link: function (scope, element, attrs, ngModelCtrl) {
if (attrs.type === 'radio' || attrs.type === 'checkbox') { return; }
var update = function () {
scope.$apply(function () {
ngModelCtrl.$setViewValue(element.val().trim());
ngModelCtrl.$render();
});
};
element.off('input').off('keydown').off('change').on('focus', function () {
scope.$apply(function () {
ngModelCtrl.$setPristine();
});
}).on('blur', update).on('keydown', function (e) {
if (e.keyCode === 13) {
update();
}
});
}
};
})