Как я могу смотреть новую строку поиска Angular -ui new ui-select (прежний ui-select2)?

Я заметил, что Angular -UI прекратил свою директиву UI-Select2 в пользу нового UI-Select (с несколькими темами - select2, bootstrap, selectize).

Он выглядит следующим образом:

<ui-select multiple ng-model="multipleDemo.colors" theme="select2" ng-disabled="disabled" style="width: 300px;">
    <ui-select-match placeholder="Select colors...">{{$item}}</ui-select-match>
    <ui-select-choices repeat="color in availableColors | filter:$select.search">
        {{color}}
    </ui-select-choices>
</ui-select>

<p>Selected: {{multipleDemo.colors}}</p>

Изначально мой selectbox должен быть пустым, но готов к набору символов, который представляет собой строку длиной не менее 4 символов, а затем вызывает вызов API для получения списка предлагаемых значений, которые должны заполнять поле. Затем будет выбрано одно значение, и поиск необходимо повторить по мере необходимости.

Сначала я пробовал $watch с ng-model, который в этом случае multipleDemo.colors (используя этот пример из демонстраций). API-вызов никогда не возникал, и тогда я понял, почему. Фактическая модель не изменяется вообще, потому что она изменяется только при выборе (мой selectbox пуст, поэтому ничего нельзя выбрать).

Мое заключение состоит в том, что я должен (быть в состоянии) $watch добавлен как фильтр, а именно filter: $select.search.

Кто-нибудь знает, как я должен использовать его в своем контроллере?

Это:

$scope.$watch('$select.search', function(newVal){
    alert(newVal);
});

не работает.

EDIT: Для справки обратитесь к этому краткому обсуждению: Можно ли добавить поддержку пользовательской функции запроса, например select2?

ИЗМЕНИТЬ 2:

Я решил это, используя $emit изнутри директивы, чтобы значение теперь доступно в моем контроллере. Но теперь я хотел бы знать, как я могу переопределить эту часть директивы, поэтому сама директива может быть оставлена ​​нетронутой, чтобы она не прерывалась в будущих обновлениях?

Ответ 1

Я решил это, создав событие в нужном месте в директиве, а затем $emitting он - в конечном итоге я могу прослушивать событие в своем контроллере и использовать его значение.

Недостатком этого является то, что я поместил его непосредственно в стороннюю директиву, чтобы его нельзя было безопасно обновлять. Мне нужно найти способ переопределить эту директиву. Если у вас есть идеи, сообщите мне.

Ответ 2

Используйте атрибут refresh в элементе <ui-select-choices> для вызова функции в своей области с помощью $select.search в качестве параметра:

<ui-select-choices repeat="color in multipleDemo.availableColors | filter:$select.search"
                   refresh="refreshColors($select.search)"
                   refresh-delay="0">
    {{color}}
</ui-select-choices>

Затем используйте функцию (refreshColors() в этом фрагменте) для обновления multipleDemo.availableColors соответственно.

Вы также можете использовать атрибут refresh-delay, чтобы указать, сколько миллисекунд должно отменить функцию, чтобы она не вызывалась слишком много раз подряд.

Я также положил availableColors на multipleDemo, как вы это сделали для multipleDemo.colors, а рекомендуется.

Ссылка: ui-select директива wiki в разделе Примеры: Async.

Ответ 3

Кажется, что есть атрибут on-select, см. пример Github:

<ui-select ng-model="person.selected" on-select="someFunction($item, $model)" [...]>
  [...]
</ui-select>

Ответ 4

Используйте ngInit для получения значения,

<div ui-select ng-init="mySelect = $select"></div>
<button ng-click="search(mySelect.search)">Search</button>

Вместо этого вы можете смотреть 'mySelect'

$scope.$watch('mySelect.search', function(newVal){
    alert(newVal);
});

Ответ 5

Почувствуйте меня, это мой первый ответ на SO.

Итак, текущий верхний ответ не работает для меня. Просто хочу предоставить другой вариант. Свойство refresh для ui-select-choice не вызывает именованную функцию в моей области.

Я следил за информацией в своих документах для доступа к выбору пользовательского интерфейса для пользовательских функций. Создайте пользовательскую директиву, в которой вы смотрите $select.search как

myModule.directive('myUiSelect', function() {
  return {
    require: 'uiSelect',
    link: function(scope, element, attrs, $select) {
      scope.$watch('$select.search', function (search) {
        if (search) {
          ...
        }
      });
    }
  };
});