【问题标题】:angular filter in order by letter按字母顺序排列的角度过滤器
【发布时间】:2015-06-23 07:26:32
【问题描述】:

我对 Angular 还是很陌生。我正在尝试向我的控制器添加一个过滤器参数,该参数将按字母顺序按单词中的每个字母过滤搜索。所以想象我的数据包含以下词:马、橙子、终结者、摩托罗拉、花卉、骨科。当我在搜索引擎中搜索“或”时,所有单词都会出现在结果中,因为它们都包含“或”。相反,我想要一个过滤器,以严格的字母顺序过滤我的数据,这样我只会得到“橙子”和“骨科”

这是我在控制器中的当前过滤器:

$scope.activateFilter = function(textBoxValue) {
  $scope.$apply(function() {
    if ( textBoxValue=="") {
      $scope.pages = FacebookPage.userPages;
    } else {
      $scope.pages=$filter('filter')($scope.pages,{name:textBoxValue});
    }
  });
};

这是过滤的 HTML,以防有帮助:

<div id="searchEngineController" ng-controller="SearchEngineController">
    <ul class="rig">
        <li ng-repeat="page in pages">
            <a ng-click="pageClick($index)">
                <img src= "{{page.image}}" class="img-responsive img-circle" height="140" width="240">
                <p style="font-size:25px; text-align:center">{{page.name}}<p>
            </a>
        </li>
    </ul>
</div>

还有我的 JS 函数:

 pagesSearchBar.pageValueDidChange = function(value) {
    angular.element(document.getElementById('searchEngineController')).scope().activateFilter(value);
 };

谢谢!

【问题讨论】:

    标签: javascript angularjs angular-filters


    【解决方案1】:

    您正在重新发明轮子。检查 ng-repeat 的角度内置过滤器

    https://docs.angularjs.org/api/ng/directive/ngRepeat

    <li ng-repeat="page in pages | filter:x">
    

    更彻底地阅读你的代码我认为你对角度逻辑也有一些误解。例如,您不需要额外的功能来检测搜索更改然后从 dom 获取范围。你可以这样做:

    <input type="text" name="search" ng-change="activateFilter(this.value)">
    

    类似的东西

    更新

    因此,如果我现在理解正确,您将只想显示一个过滤器结果。您可以通过某种方式将过滤器与 limitTo 组合来实现(现在没时间摆弄)

    或者甚至作为临时解决方案使用 css:

    .list.filtered .class-of-item {display:none;}
    .list.filtered .class-of-item:first-child {display:block;}
    

    更新 2

    好的,现在我明白了,所以您想使用严格过滤,只显示以搜索词组开头的项目。 Angular 也为此做好了准备,请查看下面的 sn-p

    angular.module('filterApp',[]);
    
    angular.module('filterApp').controller('MainCtrl',['$scope',function($scope){
      $scope.items = ['Orange','Orangutan','Words','Orchid'];
      $scope.customComparator = function(actual, expected){
        return (actual.toLowerCase().indexOf(expected.toLowerCase()) === 0);
      }
    }]);
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <div ng-app="filterApp">
      <div ng-controller="MainCtrl">
        <ul>
          <li ng-repeat="item in items | filter:'or':customComparator">{{item}}</li>
        </ul>
      </div>
    </div>

    比较器参考:https://docs.angularjs.org/api/ng/filter/filter

    【讨论】:

    • 这个解决方案不会按顺序过滤每个字母(如果我在搜索框中输入“或”,马仍然会出现在我的搜索结果中),并且不适用于我的应用程序结构(原因我不得不重新发明轮子)
    • @jgoza我不知道你所说的“每个字母都按顺序”是什么意思。如果您有任何特殊要求为什么不使用 angular 的过滤器,您需要在您的问题中很好地解释它们,然后我们可以提供帮助
    • 我编辑了我之前的评论,以更好地解释“按顺序排列的每个字母”的意思,尽管我已经在我的问题中解释了它。当我写“或”时,应该只出现“橙子”,而不是“马”
    • @jgozal 好的,我明白了,所以您想要与角度过滤器相同的功能,但只返回第一个结果?
    • 啊哈!我想我现在做到了——stackoverflow 的新手
    【解决方案2】:

    使用类似下面的东西:

    <input type="search" data-ng-model="searchName">
    <li ng-repeat="list in lists | filter:searchName">{{list}}</li>
    

    这个过滤器已经由 angular.js 提供,它本身非常强大并且非常健壮。

    我制作了这个plnkr,它有更多的功能。您可能会觉得这很有帮助。

    【讨论】:

    • 嘿 Vaibhav,谢谢。不幸的是,我的应用程序结构要求我在控制器中创建过滤器。您建议的解决方案仍然不会按顺序过滤每个字母(如果我在搜索框中输入“或”,马仍然会出现在我的搜索结果中)
    • 我正在查看它,但它似乎无法解决我的问题。我不是在寻找一个精确的过滤器。使用精确过滤器,我必须输入“oranges”才能找到结果“oranges”。我希望能够在我的结果中输入“或”并得到“橙子”,而不是“马”
    【解决方案3】:

    filter in AngularJS named 'filter' 可以用更少的代码让你的生活更轻松。

    您可以对其进行微调以对对象中的所有字段执行搜索,也可以限制对某些特定字段的搜索。

    从上面提到的链接复制粘贴示例:-

    <div ng-init="friends = [{name:'John', phone:'555-1276'},
                             {name:'Mary', phone:'800-BIG-MARY'},
                             {name:'Mike', phone:'555-4321'},
                             {name:'Adam', phone:'555-5678'},
                             {name:'Julie', phone:'555-8765'},
                             {name:'Juliette', phone:'555-5678'}]"></div>
    
    <label>Search: <input ng-model="searchText"></label>
    <table id="searchTextResults">
      <tr><th>Name</th><th>Phone</th></tr>
      <tr ng-repeat="friend in friends | filter:searchText">
        <td>{{friend.name}}</td>
        <td>{{friend.phone}}</td>
      </tr>
    </table>
    <hr>
    <label>Any: <input ng-model="search.$"></label> <br>
    <label>Name only <input ng-model="search.name"></label><br>
    <label>Phone only <input ng-model="search.phone"></label><br>
    <label>Equality <input type="checkbox" ng-model="strict"></label><br>
    <table id="searchObjResults">
      <tr><th>Name</th><th>Phone</th></tr>
      <tr ng-repeat="friendObj in friends | filter:search:strict">
        <td>{{friendObj.name}}</td>
        <td>{{friendObj.phone}}</td>
      </tr>
    </table>
    

    【讨论】:

    • 感谢@Kumar Sambhav - 我正在使用角度过滤器,但在我的控制器中(由于我的应用程序的结构方式,我无法在我的 html 中使用它)。即使我可以在 html 中使用过滤器,我认为您的解决方案也不能解决我的问题。我不是在寻找一个普通的过滤器(因为当我搜索“or”时,我的结果中会显示“horses”),我不是在寻找一个严格/精确的过滤器(因为那时我必须输入“oranges”为了在我的结果中获得“橙子”)。我希望能够搜索“或”并且只获得以“或”开头的单词,例如“橙子”和“骨科”
    【解决方案4】:
    $scope.pages=$filter('filter')($scope.pages,{name:textBoxValue},true);
    

    上面这行会改变它

    $scope.pages = $filter('filter')($scope.pages,function(index, value){
     return value === textBoxValue;
    },true);
    

    【讨论】:

    • 这是有道理的,但由于某种原因它不起作用:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多