angular ui-bootstrap typeahead callback on selectMatch?


92

Я використовую angular ui-bootstrap typeahead, і я хотів би використовувати його як спосіб вибрати багато варіантів, тому мені потрібно отримати вибране значення при запуску методу selectMatch, але я не можу знайти, як це зробити це в моєму контролері

<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">

Якщо я спостерігаю за вибраним значенням, я отримую зміни кожного разу, коли натискаємо клавішу ...

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

Я зрозумів, що метод selectMatch - це той, який викликається, коли користувач натискає клавішу Enter або клацає на списку, але я не знаю, як зробити зворотний дзвінок на це ...

Дякую !

Відповіді:


250

Зараз є кращий спосіб зробити це. Додано новий метод зворотного дзвінка

У файл контролера додайте наступне:

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

З огляду додайте наступне:

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

Для отримання додаткової інформації див. Специфікацію typeahead (шукайте onSelect).

Перевірте, чи допомагають такі URL-адреси 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
Дякую! Працював як оберіг. Це, мабуть, слід офіційно задокументувати на довідковій сторінці під заголовком Typeahead
ariestav

29
Хтось уявляє, що насправді є об’єкти мітки $ item $ model $ у тому типі зворотного викликуahead-on-select = 'onSelect ($ item, $ model, $ label)'?
AardVark71

@Matt, чи можемо ми в будь-якому випадку зробити зворотний зворотний зв'язок, використовуючи $ http з подією onSelect?
Пратік Гайквад

15
@ AardVark71 $ item $ model $ label ці три властивості, як показано нижче, відповідно. Якщо ви прив'язуєте масив JSON об'єктів, що мають більше одного властивості, тоді ви отримаєте вибраний елемент у $ item з усіма властивостями. $ model - це вбудована кутова модель, яка буде зберігати вибраний item.value і $ lable дасть вам значення, яке відображається в текстовому полі після виділення. Отже, в короткий час $ label буде дорівнювати $ model. Сподіваюся, це прояснить ваші сумніви.
Пратік Гайквад

16
@ AardVark71 Це легше пояснити , якщо вираз як: state.id as state.name for state in states. У такому випадку $itemє state, $ модель є state.id, і $labelєstate.name
Аксімілі

10

Редагувати: цей метод зараз не найкращий. Краще використовувати зворотний виклик onSelect, як описано у відповіді вище цього.

Я знайшов, як зробити те, що хотів. Я побачив, що існує атрибут typeahead, який можна редагувати, і якщо для нього встановлено значення false, вибране значення змінюється лише тоді, коли вибрано значення з моделі. І тому $ watch працює нормально, щоб перевірити, коли вибрано нове значення.

<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

Далі має бути ваш HTML

 <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)' />

просто додайте typeahead-on-select у тег введення за допомогою функції зворотного дзвінка.

Наступне буде йти всередину контролера

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

всередині $ item ви отримаєте весь об'єкт, який ви передали в основний масив списку пропозицій


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.