2013-02-06 90 views
22

代码:如何让ng-model不立即更新?

<input type="text" ng-modal="name" /> 
{{name}} 

当我输入的东西到input,以下{{name}}将立即改变。在输入所有字符并离开输入之后,它能够配置它只更新name吗?

+1

的可能重复的[Angularjs:输入\ [文本\] ngChange火灾而值正在改变](HTTP:/ /stackoverflow.com/questions/11868393/angularjs-inputtext-ngchange-fires-while-the-value-is-changing) –

回答

19

更新

正如许多人所提到的角如今已经内置支持此使用ng-model-options指令。查看更多here

<input type="text" ng-model="name" ng-model-options="{updateOn: 'blur'}" /> 

老如下答案:

有一个为NG-机型没有内置选项来改变这种行为,但你可以写一个自定义指令做。 @Gloopy写了一个像这样的指令for another question。你可以看看小提琴here

指令从input和​​事件中取消注册,这些事件在每次击键后触发更新。

<input type="text" ng-model="name" ng-model-onblur /> 

更新:

更新小提琴使用最新的稳定AngularJS(1.2.16写作的),而不是在github上直接引用的主版本。

还添加了明确的优先级,以便指令在ng-model之后运行,以确保事件侦听器正确更改。

+5

小提琴未按预期工作。它会在您输入 –

+3

时不再起作用而更新。 – mayankcpdixit

+0

注意:Angular现在已经建立了对此的支持。 https://docs.angularjs.org/api/ng/directive/ngModelOptions –

53

这是关于最近添加到AngularJS,作为未来的答案。

角较新版本(在1.3的β现在),AngularJS本身支持此选项,则使用ngModelOptions,像

ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }" 

NgModelOptions docs

实施例:

<input type="text" name="username" 
     ng-model="user.name" 
     ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" /> 
+0

它在1.3测试版5中无法正常工作,但在当前主版本2602 – manikanta

+2

中修复了使用1.2版本的任何选项?因为重拨输入元素的小提琴员发帖不再有效。 – mayankcpdixit

+0

适用于当前的beta版本(1.3.0-beta-13) – epeleg

5

工作指令代码( 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(); 
       } 
      }); 
     } 
    }; 
}) 
9

一个更好的选择是使用NG-模型选择:

<input type="text" ng-model="name" ng-model-options="{updateOn: 'blur'}" /> 
+0

然而,这是'正确'的方式只适用于更新版本的角度,不再支持ie8 ...在许多开发环境中的杀手类型:/ – Mutmatt

+5

你应该简单地杀死IE8。 Google在2012年放弃了支持。 –

+0

我在表单中有两个字段(用户名和密码)相同的问题,我想更新点击登录按钮而不是模糊或者输入字符时,我的问题是每次使用ng-model更新iphone将页面滚动到顶部 – xzegga