更改值时会触发ngChange(ngChange与经典的onChange事件不相似)。如何将经典的onChange事件与angularjs绑定在一起,只有在提交内容时才会触发?
当前绑定:
<input type="text" ng-model="name" ng-change="update()" />
更改值时会触发ngChange(ngChange与经典的onChange事件不相似)。如何将经典的onChange事件与angularjs绑定在一起,只有在提交内容时才会触发?
当前绑定:
<input type="text" ng-model="name" ng-change="update()" />
Answers:
这篇文章显示了一个指令示例,该指令将模型对输入的更改延迟到模糊事件触发之前。
这是一个小提琴,显示了ng-change与新的ng-model-on-blur指令一起使用。请注意,这是对原始提琴的略微调整。
如果将指令添加到代码中,则将绑定更改为:
<input type="text" ng-model="name" ng-model-onblur ng-change="update()" />
这是指令:
// override the default input to update on blur
angular.module('app', []).directive('ngModelOnblur', function() {
return {
restrict: 'A',
require: 'ngModel',
priority: 1, // needed for angular 1.2.x
link: function(scope, elm, attr, ngModelCtrl) {
if (attr.type === 'radio' || attr.type === 'checkbox') return;
elm.unbind('input').unbind('keydown').unbind('change');
elm.bind('blur', function() {
scope.$apply(function() {
ngModelCtrl.$setViewValue(elm.val());
});
});
}
};
});
注意:正如@wjin在下面的注释中提到的,此功能在Angular 1.3(当前为beta)中通过受到直接支持ngModelOptions
。有关更多信息,请参阅文档。
ng-blur
指令:docs.angularjs.org/api/ng.directive
ng-model-options="{ updateOn: 'default blur' }"
请参见文档
$sniffer
确定浏览器是否支持“输入”,如果不支持,他们回到“ keydown”。如果您将上述指令更新为仅在$sniffer.hasEvent('input')
返回true 时才取消绑定“输入” ,那么您可以避免该错误并仍在IE8中工作
这是关于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} }" />
使用$ scope。$ watch更好地反映范围变量的变化吗?
覆盖默认的输入onChange行为(仅当控件损失焦点和值发生更改时才调用该函数)
注意:ngChange与经典的onChange事件不同,它会在值更改时触发事件。此伪指令在获得焦点时会存储元素的值。On会
模糊检查它是否更改了新值,如果触发则触发事件@param {String}-应该触发“ onChange”时要调用的函数名称
@example <输入my-on-change =“ myFunc” ng-model =“ model”>
angular.module('app', []).directive('myOnChange', function () {
return {
restrict: 'A',
require: 'ngModel',
scope: {
myOnChange: '='
},
link: function (scope, elm, attr) {
if (attr.type === 'radio' || attr.type === 'checkbox') {
return;
}
// store value when get focus
elm.bind('focus', function () {
scope.value = elm.val();
});
// execute the event when loose focus and value was change
elm.bind('blur', function () {
var currentValue = elm.val();
if (scope.value !== currentValue) {
if (scope.myOnChange) {
scope.myOnChange();
}
}
});
}
};
});