2013-08-28 1 views
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": "" 
    } 
    }, 
] 

Также для примера выше другого, что я пытаюсь выполнить, чтобы получить детей всех продуктовых линеек. То, что я пытался, но не работает до сих пор:

Контроллер

$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

делать и это означает?

<div ng-repeat="item in items | filter1 | filter2"> 
более

информация здесь http://docs.angularjs.org/guide/dev_guide.templates.filters.using_filters

EDIT:

теперь я получил, что у штрафной написавшие фильтры, но область видимости функции, и нужно что-то вроде этого

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

мое использование класса = "{{catalogItem.IS_FINAL | iif: 'IsFinalCatalogItem': ''}}"

должен выглядеть следующим образом

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

P.S. в угловом 1.2 они добавили стандартный синтаксис iif

+0

не работает. – pv1

+0

Спасибо за помощь bresleveloper – pv1

+0

приветствую моего друга – bresleveloper

Смежные вопросы