我正在尝试使用指令两次并使用指令创建的选项进行过滤。由于某种原因,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>
答案 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
上的大小,因此它永远不会有机会比较第三个索引,所以它重新包含了包含丙酮的第二个索引