Пословный ввод с помощью AngularUI Bootstrap

Можно ли использовать директиву AngularUI Bootstrap typeahead для получения предложений только для последнего слова в предложении?

Например: если пользователь вводит «Red Ca», предложение должно быть чем-то вроде «Car, Carousel, Candle», независимо от того, какое слово стояло перед «Ca»?

Конечно, когда пользователь выбирает «Автомобиль», результатом должен быть «Красный автомобиль». Он не должен заменять все содержимое ввода.


person Phil    schedule 17.08.2015    source источник


Ответы (1)


Здесь есть 2 проблемы, чтобы заставить его работать:

  1. Отфильтровать предложения по последнему слову
  2. Сохраняйте начало ввода, когда пользователь выбирает значение для последнего слова

1) легко решается с помощью пользовательской функции для фильтрации предлагаемых значений:

$scope.containsLastWord = function(state, viewValue) {
    var words = viewValue.split(" ");
    var currentWord = words[words.length - 1];
    return state.substr(0, currentWord.length).toLowerCase() == currentWord.toLowerCase();
}

И в вашем typeahead:

typeahead="name for name in states | filter:$viewValue:containsLastWord"

2) сложнее, потому что вы не можете поймать событие select до того, как оно изменит модель. Поэтому мне пришлось отслеживать старое значение модели и изменять значение модели после выбора пользователя:

var typeaheadLastValue = "";
$scope.$watch('selected', function(newVal, oldVal) {
    typeaheadLastValue = oldVal || "";
});

$scope.typeaheadOnSelect = function(item) {
    var words = typeaheadLastValue.split(" ");
    words[words.length - 1] = item;
    $scope.selected = words.join(" ");
}

И в вашем typeahead:

typeahead-on-select="typeaheadOnSelect($item)"

Загрузите сюда: http://plnkr.co/edit/hutiNW5s58MfNBap0p1Z?p=preview

PS: этот код не обрабатывает случай, когда предложения содержат " "

person Julien Seligmann    schedule 17.03.2016
comment
Это прекрасно работает, но выделение совпадающего текста в предлагаемом списке слов не работает для любого другого слова, кроме первого слова во вводе. - person Ayan; 21.11.2017