У меня есть предварительная директива нечеткого поиска для тегов категорий:
<input type="text" class="form-control" placeholder="Apply Tags" ng-keydown="checkKeyDown($event)" ng-change="searchTags()" ng-model="searchText">
<div ng-show="searchText.length>0">
<ul>
<li ng-repeat="tag in suggestedTags | fuzzySearch : searchText : 'OR' track by $index" ng-class="{active : $index === selectedIndex}">
{{tag}}
</li>
</ul>
</div>
Вот как я справляюсь с вещами
suggestedTags: array of strings that is the full list of tags I want to match
selectedIndex: the index of the filtered suggestedTags, based on searchText
searchText: the string I'm using to match up with suggestedTags
Когда я что-то набираю, нечеткий поиск проверяет, соответствует ли то, что я набрал, чему-либо в массиве, и сокращает список предлагаемых результатов. Это работает нормально.
Однако у меня есть следующий код, который позволяет мне использовать клавиатуру для выбора из отфильтрованного списка (используя клавиши вверх, вниз и ввод):
scope.checkKeyDown = function(event) {
if (event.keyCode === 40) { //down key, increment selectedIndex
event.preventDefault();
if(scope.selectedIndex+1 !== scope.suggestedTags.length){ // check to see if at end of list
scope.selectedIndex++;
}
} else if (event.keyCode === 38) { //up key, decrement selectedIndex
event.preventDefault();
if(scope.selectedIndex-1 !== -1){ // check to see if at top of list
scope.selectedIndex--;
}
} else if (event.keyCode === 13) { //enter pressed
event.preventDefault();
scope.addToSelectedTags(scope.selectedIndex); //adds to selected tags
}
}
scope.addToSelectedTags = function (index) {
if(scope.selectedTags.indexOf(scope.suggestedTags[index]) > -1) return; // Test to see if selectedTags already has this value
scope.selectedTags.push(scope.suggestedTags[index]);
};
Проблема здесь в том, что selectedIndex будет индексом из списка отфильтровано, но когда я нажму на selectedTags, он будет из полного массива предлагаемых тегов.
Самый простой способ сделать это — просто передать строковое значение из того, что выбрано. Как я могу это сделать? Есть ли способ поместить ng-модель в <li>
(что повторяется) и выбрать все, что активно?