2014-08-27 17 views
15

Tôi có lĩnh vực này đầu vào Tôi đang sử dụng cho một tìm kiếm:Cập nhật AngularJS ng-model chỉ khi nhấn phím enter?

<input id="search_input" type="text" ng-model="filter.search_terms"> 

Có rất nhiều bộ lọc khác tôi sử dụng cũng như (hộp kiểm, radio, vv) và tôi có một $ đồng hồ trên bộ lọc vì vậy bất kỳ sự thay đổi sẽ cháy một tìm kiếm. Vấn đề là tôi không muốn tìm kiếm lửa cho trường văn bản mỗi khi tôi nhập một chữ cái và chỉ muốn nó "lưu" nó trên filter.search_terms chỉ khi tôi nhấn enter.

Có cách nào dễ dàng để thực hiện việc này không hoặc tôi có phải xóa mô hình ng và nhấp chuột vào một chức năng đặt chức năng nhập không?

Trả lời

32

Bạn có thể thử thêm ng-model-options="{updateOn : 'change blur'}" vào thẻ đầu vào của mình. Nên làm việc.

+3

Vậy là xong. Tôi có phải là người duy nhất mong đợi rằng tài liệu này (ví dụ: https://docs.angularjs.org/api/ng/directive/ngModelOptions) sẽ có danh sách những gì bạn có thể đưa vào tùy chọn ng-model và những gì nó sẽ làm gì? Nó không phải là rõ ràng với tôi tại sao "thay đổi mờ" có hành vi cụ thể nó có. –

+0

Điều này không hoạt động trên IE11 vì trong IE sự kiện "thay đổi" không được phát ra, khi phím "enter" được nhấn. Cách tôi làm việc xung quanh là tôi thay thế sự kiện "thay đổi" bằng một "keydown_enter" tùy chỉnh và tạo ra một chỉ thị phát ra "keydown_enter", khi "keydown" với 'keycode === 13' được kích hoạt trên phần tử DOM. Fyi –

8

Bạn có thể đạt được hành vi này bằng cách tạo chỉ thị có tên updateOnEnter và sau đó thêm thuộc tính này vào phần tử HTML của bạn.

<input id="search_input" type="text" update-on-enter ng-model="filter.search_terms"> 

angular.module('app').directive('updateOnEnter', function() { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function(scope, element, attrs, ctrl) { 
      element.on("keyup", function(ev) { 
       if (ev.keyCode == 13) { 
        ctrl.$commitViewValue(); 
        scope.$apply(ctrl.$setTouched); 
       } 
      }); 
     } 
    } 
}); 
+3

những gì ở đây nói góc cạnh ** không ** để cập nhật trừ khi phím đi lên? Tôi thấy sự kiện, nhưng điều gì ngăn cản việc cập nhật thông thường của mô hình? – jeremy

+0

cũng được sao chép trên https://stackoverflow.com/questions/32176130/angular-update-input-value-on-enter-keypress-and-work-in-ie –

+0

@jeremy: câu hỏi của bạn đã được trả lời trên nhận xét hàng đầu https : //stackoverflow.com/a/40756181/704246 –

11

Không có câu trả lời nào ở đây dường như trả lời đầy đủ câu hỏi. Câu hỏi đặt ra là làm thế nào để có được mô hình CHỈ cập nhật khi nhấn enter. Tôi chắc chắn rằng các poster ban đầu đã di chuyển trên, nhưng đối với những người khác có thể tìm thấy điều này, tôi sẽ thêm cách tiếp cận của tôi. Tôi nghĩ rằng ninjaPixel có gần nhất. Phản ứng của tôi dựa trên chỉ thị của anh ta.

Phần bị thiếu tuy nhiên đang ngăn chỉ thị ng-model mặc định cập nhật trong các trường hợp khác. Để làm điều đó, tôi đã thêm một tùy chọn để đầu vào để cập nhật trên KeyUp:

ng-model-options="{updateOn: 'keyup'}" 

này ghi đè mặc định mà cập nhật về các sự kiện đầu vào (đối với lĩnh vực văn bản) và buộc bản cập nhật xảy ra trên KeyUp. Điều này cho phép chỉ thị của chúng tôi để ngăn chặn hành động mặc định ng-mô hình ban đầu chỉ thị của bằng cách ngăn chặn lan truyền sự kiện trong handler KeyUp tùy chỉnh của chúng tôi:

if (ev.keyCode !== 13) return ev.stopImmediatePropagation(); 

Một làm việc codepen có thể được tìm thấy ở đây: http://codepen.io/jessehouchins/pen/MbmEgM

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