Angularjs:input [text] ngChange在值发生变化时触发

Kaf*_*hne 92 angularjs

当值改变时,ngChange正在触发(ngChange与经典的onChange事件不同).如何将经典的onChange事件与angularjs绑定,只有在提交内容时才会触发?

当前绑定:

<input type="text" ng-model="name" ng-change="update()" />
Run Code Online (Sandbox Code Playgroud)

Glo*_*opy 96

这篇文章展示了一个指令示例,该指令将模型更改延迟到输入,直到模糊事件触发为止.

是一个小提琴,显示ng-change使用新的ng-model-on-blur指令.请注意,这是对原始小提琴的轻微调整.

如果将指令添加到代码中,则会将绑定更改为:

<input type="text" ng-model="name" ng-model-onblur ng-change="update()" />
Run Code Online (Sandbox Code Playgroud)

这是指令:

// 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());
                });         
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

注意:正如@wjin在下面的评论中提到的,此功能直接在Angular 1.3(目前处于测试阶段)通过ngModelOptions.有关详细信息,请参阅文档.

  • 我使这段代码工作,但我必须设置指令的优先级(即优先级:100).我正在使用Angular 1.2.10.我的猜测是ngModelOnblur指令在ngModel指令之前运行,所以还没有解除绑定的东西.此外,这个页面似乎可能会在未来有一个内置的解决方案:https://github.com/angular/angular.js/pull/1783 (5认同)
  • 注意至少在角度1.3中,默认实现中通过`ng-model-options ="{updateOn:'default blur'}支持此功能."参见[文档](https://docs.angularjs.org/api/纳克/指令/ ngModelOptions) (4认同)
  • @RobJuurlink(或者在尝试绑定或取消绑定到'input'时遇到IE8'TypeError'的任何人) - 看看Angular的源代码,你会发现他们使用`$ sniffer`来确定浏览器是否支持'input'如果没有,他们会回到'keydown'.如果你将上面的指令更新为仅仅取消绑定'input',如果`$ sniffer.hasEvent('input')`返回true - 那么你可以避免这个错误并仍在IE8中工作 (2认同)

man*_*nta 32

这是关于AngularJS的最新补充,作为未来的答案(也是另一个问题).

Angular更新的版本(现在在1.3测试版中),AngularJS本身支持这个选项,使用ngModelOptions

ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"
Run Code Online (Sandbox Code Playgroud)

NgModelOptions文档

例:

<input type="text" name="username"
       ng-model="user.name"
       ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />
Run Code Online (Sandbox Code Playgroud)


Bin*_*Han 8

如果其他人正在寻找额外的"输入"按键支持,这里是对Gloppy提供的小提琴的更新

按键绑定代码:

elm.bind("keydown keypress", function(event) {
    if (event.which === 13) {
        scope.$apply(function() {
            ngModelCtrl.$setViewValue(elm.val());
        });
    }
});
Run Code Online (Sandbox Code Playgroud)


Bra*_*row 5

对于任何与IE8斗争的人(它不喜欢unbind('input'),我找到了解决方法.

将$ sniffer注入您的指令并使用:

if($sniffer.hasEvent('input')){
    elm.unbind('input');
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,IE8会平静下来:)