Angularjs:input ngChange在值改变时触发
ngChange在值改变时触发(ngChange与经典的onChange事件不相似)。 我怎么能绑定经典的onChange事件与angularjs,只会触发内容提交?
当前绑定:
<input type="text" ng-model="name" ng-change="update()" />
这篇文章展示了一个指令的例子,该指令将模型更改延迟到input,直到blur事件触发。
这是一个小提琴,显示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(目前处于testing阶段)通过ngModelOptions
。 有关更多信息,请参阅文档 。
这是关于AngularJS最近的补充,作为未来的答案(也是另一个问题 )。
angular度较新的版本(现在在1.3testing版),AngularJS本身支持这个选项,使用ngModelOptions
,就像
ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"
NgModelOptions文档
例:
<input type="text" name="username" ng-model="user.name" ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />
如果其他人在寻找额外的“input”按键支持,这里是由Gloppy提供的小提琴更新
键盘绑定代码:
elm.bind("keydown keypress", function(event) { if (event.which === 13) { scope.$apply(function() { ngModelCtrl.$setViewValue(elm.val()); }); } });
对于任何人与IE8挣扎(它不喜欢解除绑定(“input”),我find了解决办法。
注入$嗅探器到您的指令,并使用:
if($sniffer.hasEvent('input')){ elm.unbind('input'); }
IE8冷静,如果你这样做:)
据我所知,我们应该使用select选项ng-change,在文本框的情况下,我们应该使用ng-blur。
是不是使用$ scope。$ watch来更好地反映范围variables的变化?
覆盖默认的inputonChange行为(只有在控件丢失焦点和值发生变化时调用函数)
注意:ngChange和传统的onChange事件不一样,它在值改变的时候触发事件。这个指令在获取焦点时存储元素的值
在模糊模式下,它会检查新值是否已更改,如果是,则会触发事件@param {String} – 应该触发“onChange”时调用的函数名称
@example <inputmy-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(); } } }); } }; });
我有完全相同的问题,这对我工作。 添加ng-model-update
和ng-keyup
,你很好走! 这里是文档
<input type="text" name="userName" ng-model="user.name" ng-change="update()" ng-model-options="{ updateOn: 'blur' }" ng-keyup="cancel($event)" />