Angularjs 只筛选一个属性或所有字段
我正在创建一个站点,其中的对象都具有“tags”属性,即字符串列表 我正在创建一个搜索功能来过滤列表中的所有元素。如果用户输入“#somethine here”,那么我只想将用户输入与每个属性的标记相匹配。如果用户只是在搜索框中输入一个字符串,那么我想搜索所有对象属性 我有一个这样定义的表单:Angularjs 只筛选一个属性或所有字段,angularjs,angularjs-filter,meanjs,Angularjs,Angularjs Filter,Meanjs,我正在创建一个站点,其中的对象都具有“tags”属性,即字符串列表 我正在创建一个搜索功能来过滤列表中的所有元素。如果用户输入“#somethine here”,那么我只想将用户输入与每个属性的标记相匹配。如果用户只是在搜索框中输入一个字符串,那么我想搜索所有对象属性 我有一个这样定义的表单: <form class="navbar-form navbar-left" role="search"> <div class="form-group"> <in
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input data-ng-model="$root.searchText" type="text" class="form-control" placeholder="#hashtag or just a string">
</div>
</form>
我知道,如果我用我想要的字段定义数据ng模型,默认过滤器可以按照我想要的方式使用。所以,如果我只想搜索标记,我会使用数据ng model='$root.searchText.tags',用户输入只会匹配它。如果我想全部搜索,那么我会使用数据ng model='$root.searchText.$'
但是,如何根据用户是否键入开头带有“#”的字符串来切换模型
我尝试过创建一个自定义过滤器,但这让人困惑。应该有某种条件语句将模型设置为$root.searchText.tags或$root.searchText.$,但这比我想象的更困难。有人知道如何构造条件语句吗 我为您提供了一个解决方案,尽管这可能不是最好的解决办法。 您可以查看搜索筛选器并根据逻辑更新列表: 1.如果searchText以“#”开头,则按标记筛选 2.如果searchText不以“#”开头,则按属性值进行筛选
这很有效!现在唯一的问题是,在页面加载时,我自己代码中的$scope.model.list实际上是空的,必须从数据库异步查询。因此,当页面第一次加载时,屏幕上没有显示任何内容,因为watch筛选器运行时的列表为空。
$scope.$watch('model.search', function(search){
var tagFilter,results;
if(search.startsWith('#')) { //handle tag filter logic
tagFilters = search.split('#');
console.log(tagFilters);
results = _.filter($scope.model.lists, function(obj){
return _.intersection(obj.tags, tagFilters).length > 0;
});
} else { //handle property filter logic
results = _.filter($scope.model.lists, function (obj) {
return _.values(obj).some(function (el) {
return el.indexOf(search) > -1;
});
});
}
console.log(results);
$scope.model.displayItems = results;
}, true);