Angularjs 只筛选一个属性或所有字段

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

我正在创建一个站点,其中的对象都具有“tags”属性,即字符串列表

我正在创建一个搜索功能来过滤列表中的所有元素。如果用户输入“#somethine here”,那么我只想将用户输入与每个属性的标记相匹配。如果用户只是在搜索框中输入一个字符串,那么我想搜索所有对象属性

我有一个这样定义的表单:

<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);