2013-02-06 42 views
22

Code:Làm thế nào để cho mô hình ng không cập nhật ngay lập tức?

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

Khi tôi vào một cái gì đó vào input, các {{name}} sau sẽ thay đổi ngay lập tức. Có thể cấu hình nó chỉ cập nhật các name sau khi tôi nhập tất cả các ký tự và để lại đầu vào?

+1

thể trùng lặp của [Angularjs: đầu vào \ [text \] ngChange cháy trong khi giá trị đang thay đổi] (http://stackoverflow.com/questions/11868393/angularjs-inputtext-ngchange-fires-while-the-value-is-changing) –

Trả lời

19

Cập nhật

Như nhiều người đã đề cập ở góc hiện nay đã được xây dựng trong hỗ trợ cho điều này bằng cách sử dụng chỉ thị ng-model-options. Xem thêm here.

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

Cũ câu trả lời dưới đây:

Không có built-in tùy chọn cho ng-mô hình để thay đổi hành vi đó, nhưng bạn có thể viết một chỉ thị tùy chỉnh làm việc đó. @Gloopy đã viết một chỉ thị như vậy for another question. Bạn có thể xem fiddle here.

Chỉ thị hủy đăng ký khỏi các sự kiện inputkeydown kích hoạt cập nhật sau mỗi lần nhấn phím.

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

Cập nhật:

fiddle cập nhật để sử dụng AngularJS ổn định mới nhất (1.2.16 như các văn bản), thay vì trực tiếp tham khảo phiên bản thạc sĩ tại github.

Cũng thêm một mức độ ưu tiên rõ ràng để chỉ thị được chạy sau ng-model để đảm bảo người nghe sự kiện được thay đổi chính xác.

+5

Fiddle không hoạt động như mong đợi. Bản cập nhật khi bạn nhập –

+3

không hoạt động nữa. – mayankcpdixit

+0

Lưu ý: Góc đã tích hợp hỗ trợ cho việc này ngay bây giờ. https://docs.angularjs.org/api/ng/directive/ngModelOptions –

53

Đây là phần bổ sung gần đây cho AngularJS, để phục vụ như câu trả lời trong tương lai.

phiên bản góc mới (bây giờ trong 1.3 beta), AngularJS natively hỗ trợ tùy chọn này, sử dụng ngModelOptions, như

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

NgModelOptions docs

Ví dụ:

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

Nó không hoạt động chính xác trong 1,3 beta 5, nhưng cố định trong bản dựng tổng thể hiện tại 2602 – manikanta

+2

bất kỳ tùy chọn nào sử dụng phiên bản 1.2? coz các fiddle người đăng bài về trọng lượng đầu vào phần tử không hoạt động nữa. – mayankcpdixit

+0

hoạt động đúng với phiên bản beta hiện tại (1.3.0-beta-13) – epeleg

5

Làm việc đang chỉ thị (ng-1.2RC3): sử dụng: 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

Một lựa chọn tốt hơn là sử dụng các ng-mô hình lựa chọn:

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

này, tuy nhiên, là 'quyền' cách chỉ hoạt động trong các phiên bản mới hơn của góc mà không còn hỗ trợ ie8 ... loại của một kẻ giết người trong rất nhiều dev env:/ – Mutmatt

+5

Bạn chỉ cần giết IE8. Google đã bỏ hỗ trợ vào năm 2012. –

+0

Tôi có cùng một vấn đề với hai trường (người dùng và mật khẩu) trong biểu mẫu, tôi muốn cập nhật khi nhấp vào nút đăng nhập không bị mờ hoặc nhập ký tự, vấn đề của tôi là mỗi lần ng-model cập nhật iphone di chuyển trang lên đầu trang – xzegga

Các vấn đề liên quan