Angularjs:在同一数据集上使用多个组合框指令进行过滤

时间:2015-08-14 14:37:47

标签: angularjs angularjs-directive

我正在尝试使用指令两次并使用指令创建的选项进行过滤。由于某种原因,chemicalsFilter没有按预期工作。如果我使用ng-repeat上的任何一个过滤器它可以工作但是同时使用它们都不起作用。我想知道这是否可能是指令中的范围问题,但每个似乎都返回正确的数据。它按照我的预期在控制台中输出,但过滤不能按预期工作。

有什么想法吗?如果我可以对它进行排序,那么在我的项目中创建多个组合框会更容易。

这是我的示例plnkr: http://plnkr.co/edit/FTPdSSiKSOZiWptfJzuC?p=preview

原始示例(两个示例都做同样的事情): http://democode.6te.net/filterusingdirectives/

        <div ng-controller="resultsCtrl">

            <div ng-controller="chemicals">

                <combo-box url="/filterusingdirectives/php/getChemicals.php" list-name="Select Chemicals" loading-message="loading chemicals ..." combo-box-directive-selected-values="getSelectedChemicalValues"></combo-box>

            </div>
            <div ng-controller="letters">

                <combo-box url="/filterusingdirectives/php/getLetters.php" list-name="Select Letters" loading-message="loading letters ..." combo-box-directive-selected-values="getSelectedLetterValues"></combo-box>

            </div>

            <div ng-repeat="result in results | chemicalsFilter:selectedChemicalValues | lettersFilter:selectedLetterValues">
                letterId:   {{result.letterId}}
                <br />
                chemicalId: {{result.chemId}}
                <br />
                name: {{result.name}}
                <br /><br />
            </div>
        </div>  

1 个答案:

答案 0 :(得分:2)

内部循环必须替换为相应的选定(&#34; selectedLetterValues和selectedChemicalValues&#34;)值而不是结果。

lettersFilter:

for (var i = 0; i < results.length; i++) {
 for (var j = 0; j < selectedLetterValues.length; j++) {
    .......
 }
}

chemicalsFilter:

for (var i = 0; i < results.length; i++) {
 for (var j = 0; j < selectedChemicalValues.length; j++) {
    .......
 }
}

更新: 除了逻辑之外,我没有看到任何其他问题。可能你已经调试过它并想到为什么过滤器多次执行,可能这是一个问题。这是explanation

为什么你的代码无效?

当你点击醋酸时(为了舒适起见,我们只会使用letterId)

in chemicalsFilter(results, selectedChemicalValues):
input  results=[letterID:10, letterId:20, litterId:30]
       selectedChemicalValues=[letterId:20, litterId:30]

       for (var i = 0; i < results.length; i++) {
        for (var j = 0; j < results.length; j++) {
           .......
        }
       }

output filteredResults = [letterId:20, litterId:30]

in lettersFilter(filteredResults, selectedLetterValues):
input results=[letterId:20, litterId:30]
      selectedLetterValues=[letterID:10, letterId:20, litterId:30]

      for (var i = 0; i < results.length; i++) {
       for (var j = 0; j < results.length; j++) {
           .......
       }
      }

output filteredResults = [letterId:20]

lettersFilter中,外部循环和内部循环都检查results.length上的大小,因此它永远不会有机会比较第三个索引,所以它重新包含了包含丙酮的第二个索引