【问题标题】:angularjs - Filter to hide from repeaterangularjs - 过滤器以隐藏转发器
【发布时间】:2017-01-13 14:56:50
【问题描述】:

我正在尝试编写一个小过滤器来隐藏我的转发器元素。

假设我的范围是:

$scope.test = [
    {id: 1,name: "Test number 1"},
    {id: 2,name: "Test number 2"},
    {id: 3,name: "Test number 3"},
    {id: 4,name: "Test number 4"},
    {id: 5,name: "Test number 5"},
    {id: 6,name: "Test number 6"},
    {id: 7,name: "Test number 7"},
    {id: 8,name: "Test number 8"},
    {id: 9,name: "Test number 9"},
    {id: 10,name: "Test number 10"} 
]

在我的中继器中,我正在做这样的事情:

<div ng-repeat="t in test| hide:[1,6]"></div>

我开始编写我的过滤器,但我卡住了。这是我目前所拥有的:

filter('hideIDs', function() {
  newArray= [];

  function(zone, IDS) {
    var containsObject, newArray;
    containsObject = function(obj, list) {
      var i;
      i = void 0;
      i = 0;
      while (i < list.length) {
        if (list[i] === obj) {
          return true;
        }
        i++;
      }
      return false;
    };

    angular.forEach(IDS, function(hide) {
      return angular.forEach(test, function(t) {
        if (t.id === hide) {
          return
        } else {
          if (containsObject(t, newArray)) {
            return
          } else {
            newArray.push(t);
          }
        }
      });
    });
    return newArray;
  };
});

我想用过滤器做的是:

检查t.id是否应该被隐藏,如果是,return不推送到newArray

我遇到的问题是:

在第一个循环中要隐藏的 ID 是 1,然后 6 被推送

在第二个循环中,要隐藏的 id 是 6,然后 1 被推送

无论如何,我最终都拥有它们。

建议?

你会以一种有效的角度方式实现这一目标吗?

非常感谢

【问题讨论】:

    标签: angularjs angularjs-ng-repeat angularjs-filter angular-filters


    【解决方案1】:

    这个怎么样? https://plnkr.co/edit/hPiOnq7jp4kIP6h8Ox1d?p=preview

    <div ng-init="data = [{id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5}]">
      <div ng-repeat="test in data | hideByIds:[2, 4]">
        {{ test.id }}
      </div>
    </div>
    

    您应该尽可能地重复使用,在这种情况下是 filter 过滤器:

    var app = angular.module('app', []);
    
    app.filter( 'hideByIds', function( $filter ) {
      return function( input, ids ) {
        return $filter('filter')( input, function( it ) {
          return ids.indexOf( it.id ) == -1;
        } );
      }
    } );
    

    另一种方法是在作用域上指定谓词函数,然后简单地将其传递给模板中的过滤器。

    【讨论】:

    • 在这个 stile 中写入会导致“为什么我的 Angular 应用程序太慢?”
    • @PetrAveryanov 你能解释一下你的评论吗?我真的很担心我的应用程序变慢了
    • 过滤器运行每个摘要 - 它们应该非常快。使用 ~ (m*n) 时间的 2 个数组操作的过滤器不能很快。
    • @Nick 在作用域上创建一个隐藏了必要元素的新数组,并且仅在 ids(您要隐藏的)更改时刷新它。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2022-08-18
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多