4

製品ライン、サブライン、サブラインなどの階層データ モデルがあります。特定のラインまたはサブラインの直接の子孫 (孫ではなく息子) であるサブラインのみを分離しようとしています。

ここに私の既存のデータモデルがあります:

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": ""
    }
  },
]

また、上記の例で達成しようとしているもう 1 つのことは、すべての製品ラインの子を取得することです。私が試したものの、これまでのところ機能していないのは次のとおりです。

コントローラ

$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>
4

1 に答える 1

4

これのことですか?

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

ps angular 1.2では、標準のiif構文が追加されました

于 2013-08-28T07:54:44.500 に答える