【问题标题】:Nested filters in angular for hierarchical data model用于分层数据模型的角度嵌套过滤器
【发布时间】:2013-08-29 18:57:15
【问题描述】:

我有一个分层数据模型,其中包含产品线,然后是子线,然后是子线的子线等。我要做的是仅隔离作为特定线或子线的直接后代(儿子而不是孙子)的子线.

这是我现有的数据模型:

items:[
  {
    "_id": "1",
    "description": "sth1",
    "name": "smname1",
    "level_type": "line",
    "ancestor": "",
    "descendant": "smname2"
   }
  },
  {
    "_id": "2",
    "description": "sth2",
    "name": "smname1",
    "level_type": "subline",
    "ancestor": "smname1",
    "descendant": ""
    }
  },
]

对于上面的示例,我想要完成的另一件事是获取所有产品线的子项。我尝试过但到目前为止没有工作的是:

控制器

$scope.prodClassIsALine = function(item) {
        return item.level_type=='line';
    };

    $scope.prodClassIsASubLineof = function(item) {
        return item.ancestor==$scope.prodClassIsALine.name;
};

悲剧性的提议只是为了向您表明我需要所有行的所有子项,即所有具有行项目的祖先名称的项目。

HTML

<div ng-repeat="item in items  | filter:prodClassIsALine:prodClassIsASubLineof"> 
  <p>{[{item.name}]}</p>
</div> 

这是我们在 AngularJS 中嵌套过滤器的方式吗?似乎过滤器正在迭代作为属性给出的列表,但我无法详细了解它们是如何工作的。请帮忙。

解决方案

在 script.js 中

//product is my ng-module
//filter to get all product classes that are lines
product.filter('prodClassIsALine', function() {
    return function(input) {
      var out = [];
      for (var i = 0; i < input.length; i++) {
        if (input[i].level_type=='line') {
            out.push(input[i])
        };
      };
      return out;
    };
});

//filter to get all children of product classes that are lines
product.filter('prodClassLineChild', function() {
    return function(input) {
      var out = [];
      var out2 = [];
      for (var i = 0; i < input.length; i++) {
        if (input[i].level_type=='line') {
            out2.push(input[i])
        };
      };
      for (var i = 0; i < out2.length; i++) {
        for (var j = 0; j < input.length; j++) {
            if (input[j].ancestor==out2[i].name) {
                out.push(input[j])
            };
        };
      };
      return out;
    };
});

HTML

<div ng-repeat="item in items  | prodClassIsALine"> 
<!-- or <div ng-repeat="item in items  | prodClassLineChild"-->
  <p>{[{item.name}]}</p>
</div>

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    你是这个意思吗?

    <div ng-repeat="item in items  | filter1 | filter2"> 
    

    更多信息在这里 http://docs.angularjs.org/guide/dev_guide.templates.filters.using_filters

    编辑:

    现在我知道你没有写过滤器而是范围函数,你需要这样的东西

    myModule.filter('iif', function () {
        return function (input, trueValue, falseValue) {
            return input ? trueValue : falseValue;
        };
    });
    

    我的使用是 class="{{ catalogItem.IS_FINAL | iif : 'IsFinalCatalogItem' : '' }}"

    应该是这样的

    myModule.filter('prodClassIsALine', function() {
        return function(item) {
            return item.level_type=='line';
        };
    });
    

    附言在 Angular 1.2 中,他们添加了标准 iif 语法

    【讨论】:

    • 不起作用。
    • 感谢您的帮助 bresleveloper
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多