góc gọi lại ui-bootstrap typeahead trên selectMatch?


92

Tôi đang sử dụng kiểu chữ ui-bootstrap góc cạnh và tôi muốn sử dụng nó như một cách để chọn nhiều lựa chọn, vì vậy tôi cần lấy giá trị đã chọn khi khởi chạy phương thức selectMatch nhưng tôi không thể tìm thấy cách thực hiện cái đó trong bộ điều khiển của tôi

<div class='container-fluid' ng-controller="TypeaheadCtrl">
<pre>Model: {{selected| json}}</pre>
<input type="text" ng-model="selected" typeahead="state for state in states | filter:$viewValue">

Nếu tôi xem giá trị đã chọn, tôi nhận được thay đổi mỗi khi nhấn một phím ...

scope.$watch('selected', function(newValue, oldValue) {... });

Tôi hiểu rằng phương thức selectMatch là phương thức được gọi khi người dùng nhấn enter hoặc nhấp vào danh sách nhưng tôi không biết làm cách nào để gọi lại phương thức đó ...

Cảm ơn !

Câu trả lời:


250

Có một cách tốt hơn để làm điều này bây giờ. Một phương thức gọi lại mới đã được thêm vào

Trong tệp bộ điều khiển, thêm phần sau:

 $scope.onSelect = function ($item, $model, $label) {
    $scope.$item = $item;
    $scope.$model = $model;
    $scope.$label = $label;
};

Trong chế độ xem, hãy thêm những thứ sau:

 <input type="text"
        ng-model="selected"
        typeahead="state for state in states | filter:$viewValue"
        typeahead-editable="false"
        typeahead-on-select="onSelect($item, $model, $label)"/>

Xem thông số kỹ thuật đánh máy để biết thêm thông tin (tìm kiếm onSelect).

Kiểm tra xem các URL sau có hữu ích không http://www.techguides.in/how-to-create-autocomplete-using-angularjs-ui/

http://www.techguides.in/how-to-customize-autocomplete-to-display-multiple-columns-using-angularjs-ui-2/


2
Cảm ơn! Làm việc như người ở. Điều này có lẽ nên được ghi lại chính thức tại trang tham chiếu dưới tiêu đề Typeahead
ariestav

29
Có ai biết các đối tượng $ item $ model $ label thực sự là gì trong callback typeahead-on-select = 'onSelect ($ item, $ model, $ label)' không?
AardVark71

@Matt, liệu chúng ta có thể đăng lại bằng cách sử dụng $ http với sự kiện onSelect không?
Pratik Gaikwad

15
@ AardVark71 $ item $ model $ nhãn ba thuộc tính này tương ứng như bên dưới. Nếu bạn đang ràng buộc mảng JSON của các đối tượng có nhiều hơn một thuộc tính, thì bạn sẽ nhận được mục đã chọn trong $ item với tất cả các thuộc tính. $ model là mô hình góc có sẵn được sử dụng sẽ lưu trữ item.value đã chọn và $ lable sẽ cung cấp cho bạn giá trị được hiển thị trong hộp văn bản sau khi chọn. Vì vậy, trong một thời gian ngắn, $ label sẽ bằng $ model. Hy vọng điều này làm rõ nghi ngờ của bạn.
Pratik Gaikwad

16
@ AardVark71 Nó là dễ dàng hơn để giải thích nếu biểu thức là như sau: state.id as state.name for state in states. Trong trường hợp đó $itemstate, $ mô hình state.id, và $labelstate.name
Aximili

10

Chỉnh sửa: phương pháp này không phải là phương pháp tốt nhất bây giờ. Tốt hơn là sử dụng gọi lại onSelect như được giải thích trong câu trả lời ở trên câu trả lời này.

Tôi tìm thấy làm thế nào để làm những gì tôi muốn. Tôi đã thấy rằng có một thuộc tính typeahead-editable và nếu nó được đặt thành false thì giá trị đã chọn chỉ thay đổi khi một giá trị từ mô hình được chọn. Và do đó, đồng hồ $ đang hoạt động tốt để kiểm tra khi giá trị mới được chọn.

<input type="text" ng-model="selected" typeahead="state for state in states | filter:$viewValue" typeahead-editable="false">

link: function(scope, elm, attrs){
    scope.$watch('selected', function(newValue, oldValue) {
        if (newValue)
          console.log(oldValue+"->"+newValue);
     });
}

2

Sau đây sẽ là HTML của bạn

 <input id="title" type="text"  ng-model="title"  typeahead="data.enquiry_title for data in titleData | filter:$viewValue | limitTo:8" 
typeahead-on-select='onSelect($item, $model, $label)' />

chỉ cần thêm phần đánh máy khi chọn trong thẻ đầu vào với chức năng gọi lại.

Sau đây sẽ đi vào bên trong bộ điều khiển

$scope.onSelect = function ($item, $model, $label) {
            console.log($item);
            if($item.tid)
                $scope.activeTitleId = $item.tid
        };

bên trong $ item, bạn sẽ nhận được toàn bộ đối tượng mà bạn đã chuyển vào mảng chính của danh sách gợi ý


0

thử những điều sau đây trước khi xác thực

 modelCtrl.$setValidity('editable', true);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.