AngularJS md自动完成返回所有可能的子字符串
我用它来让用户搜索我大学里的科目 问题是我的搜索功能仅按顺序(从左到右)搜索每个显示值 例如:如果我搜索“艺术与建筑”,我会得到“未找到结果”,这是我不希望发生的 我希望《艺术与建筑》能给出一个结果 主题采用以下格式:AngularJS md自动完成返回所有可能的子字符串,angularjs,search,angular-material,Angularjs,Search,Angular Material,我用它来让用户搜索我大学里的科目 问题是我的搜索功能仅按顺序(从左到右)搜索每个显示值 例如:如果我搜索“艺术与建筑”,我会得到“未找到结果”,这是我不希望发生的 我希望《艺术与建筑》能给出一个结果 主题采用以下格式: $scope.subjects = [ { value: 'AA', display: 'AA - Arts and Architecture' }, { value: 'AAAS', display: 'AAAS - African/
$scope.subjects = [
{
value: 'AA',
display: 'AA - Arts and Architecture'
},
{
value: 'AAAS',
display: 'AAAS - African/Afr Amer Studies'
},
{
value: 'ABA',
display: 'ABA - Applied Behavior Analysis'
},
{
value: 'ABE',
display: 'ABE - Ag and Biological Engineering'
}
]
以下是我的搜索方法:
$scope.searchQuery = function(text) {
text = text.toUpperCase();
var result = $scope.subjects.filter(function(item) {
return item.display.includes(text);
});
return result;
}
这是我的html:
<md-autocomplete
md-selected-item="selectedItem"
md-search-text="searchText"
md-items="item in searchQuery(searchText)"
md-item-text="item.display"
md-min-length="0"
placeholder="Select a subject">
<md-item-template>
<span md-highlight-text="searchText">{{item.display}}</span>
</md-item-template>
<md-not-found>
No matches found.
</md-not-found>
</md-autocomplete>
{{item.display}
没有找到匹配项。
根据文档JS方法str.includes(searchString[,position])
说明:
参数:位置->可选。字符串中开始搜索的位置
用于搜索字符串。(默认值为0)
因此,您的代码是从索引0开始的
改用indexOf怎么样?更改此行:return item.display.includes(文本)代码>
返回项目。显示。索引(文本)!=-1;代码>问题
这是因为区分大小写,也就是说,你实际上在做与
"Arts and Architecture".includes("ARTS AND ARCHITECTURE"); // false
…由于区分大小写,因此返回false
。它恰好在字符串的开头起作用,因为所有字母都是大写的,输入也是大写的:
"AA".includes("AA"); // true (fluke!)
解决方案
如果您使项.显示
和文本
均为大写,则应能正常工作:
$scope.searchQuery = function(text) {
var result = $scope.subjects.filter(function(item) {
return item.display.toUpperCase().includes(text.toUpperCase());
});
return result;
}
“includes”函数仅检查目标字符串中是否存在搜索字符串。要使md autocomplete正常工作,您需要匹配包含搜索文本或部分搜索文本的数组中的对象。将代码修改为:
$scope.searchQuery = function(text) {
var result = $scope.subjects.filter(function(item) {
if (item.display.toUpperCase().indexOf(text.toUpperCase()) >-1)
return item;
});
return result;
}
没问题,你可以随时投票!很高兴这有帮助。