【发布时间】:2016-01-06 05:40:20
【问题描述】:
嗯,我有这个plunkr 试图模拟我的情况:
这个想法是用户在文本框中键入一个单词,当单击按钮时,角度服务会根据在文本框中键入的内容从数据库返回答案(结果)(我已经用请求数据模拟了这个过程到一个 json 文件,所以无论你输入什么都不重要,总是会返回整个数据)并填充一个表。
但现在,我正在使用过滤器搜索。在此文本框中,您可以搜索由以下人员定义的人员:
- 名字
- 中间名
- 姓氏
- second_surname
我已经实现了两种视觉过滤器:
1) 用于隐藏和显示结果的可视化过滤器:(在 appCtrl.js 中定义)
$scope.changedValue=function(){
var condition = $scope.filter.condition;
$scope.Model.filteredlist = filterFilter($scope.Model.expenses,function(value, index, array){
var fullname = (value.first_name+' '+value.middle_name+' '+value.first_surname+' '+value.second_surname).toLowerCase();
if (fullname.indexOf(condition.replace(/\s\s+/g, ' ').toLowerCase()) > -1 ) {
return array;
}
});
if (typeof $scope.Model.filteredlist != 'undefined') { // When page loads for first time
$scope.setPage();
}
}
2) 用于突出显示结果的视觉过滤器:(在 appDrct.js 中定义)
app.directive('highLight', function ($document, $sce) {
var component = function(scope, element, attrs) {
if (!attrs.highlightClass) {
attrs.highlightClass = 'angular-highlight';
}
var replacer = function(match, item) {
return '<span class="'+attrs.highlightClass+'">'+match+'</span>';
}
var tokenize = function(keywords) {
keywords = keywords.replace(new RegExp(',$','g'), '').split(' ');
var i;
var l = keywords.length;
for (i=0;i<l;i++) {
keywords[i] = keywords[i].replace(new RegExp('^ | $','g'), '');
}
return keywords;
}
scope.$watch('keywords', function(newValue, oldValue) {
console.log("new: " + newValue + " old " + oldValue);
var tokenized = tokenize(newValue);
var regex = new RegExp(tokenized.join('|'), 'gmi');
if(newValue.length>=1 || oldValue.length>=1){
for(i=0;i<=1;i++){
element[0].cells[i].innerHTML = element[0].cells[i].innerText.replace(regex, replacer);
}
}
});
}
return {
link: component,
replace: false,
scope: {
keywords: '=highLight'
}
};
});
调用这些过滤器的 html:(在 table.html 中定义)
<input type="text" class="form-control" id="filter-list" placeholder="Name(s) and/or Lastname(s)" ng-model="filter.condition" ng-change="changedValue()">
......
<tr ng-repeat="expense in Model.filteredlist | pagination: pagination.currentPage : numPerPage" x-high:light="filter.condition">
<td>{{expense.first_name}} {{expense.middle_name}}</td>
<td>{{expense.first_surname}} {{expense.second_surname}}</td>
<td>{{expense.age}}</td>
</tr>
但我遇到了一些问题,因为有时这个人没有 middle_name 或者有时没有 second_surname。
要重现我的问题,请在搜索框中输入:Lora,然后将其删除,您会看到某些数据未以正确的方式呈现。如果您键入 Loras 并擦除 s,则该单词不会再次突出显示,但如果您继续擦除,该单词会再次突出显示。
那么,我做错了什么?我认为这是$scope.changeValue 过滤器的问题,但我迷路了。
有什么想法吗?
【问题讨论】:
标签: javascript angularjs angularjs-directive filtering angularjs-filter