我向我的视图传递了2个数组。我希望我的嵌套循环只显示它的parent_id值与parent.id匹配的位置。例如
arr1 = {"0":{"id":326,"parent_id":0,"title":"Mellow Mushroom voucher","full_name":"Patrick","message":"The voucher says $10 Voucher; some wording on the printout says, \"This voucher is valid for $20 Pizza\" but my purchase price or amount paid also says $20. Shouldn't that be $10","type":"Deals"}};
arr2 = {"0":{"id":327,"parent_id":326,"title":"Re: Mellow Mushroom voucher","full_name":"Patrick Williams","message":"Some message here","type":null};
...
<div data-ng-repeat = "parent in arr1">
<span>{{parent.title}}<span>
<div data-ng-repeat="child in arr2 | only-show-where-child.parent_id == parent.id">
<li>{{child.body}}</li>
</div>
</div>
这是角度中的可能/最佳实践吗?我应该在将节点传递给角度之前过滤节点中的对象吗?谢谢!
答案 0 :(得分:10)
data-ng-if
取代使用过滤器,而不是使用过滤器。
<div data-ng-repeat="parent in arr1">
<span>{{parent.title}}<span>
<div data-ng-repeat="child in arr2" data-ng-if="child.parent_id == parent.id">
<li>{{child.body}}</li>
</div>
</div>
答案 1 :(得分:10)
有两种方法可以做到这一点......你可以创建一个只返回孩子的函数:
$scope.getChildren = function(parent) {
var children = [];
for (var i = 0; i < arr2.length; i++) {
if (arr2[i].parent_id == parent.id) {
children.push(arr2[i]);
}
}
return children;
};
HTML:
<div ng-repeat="child in getChildren(parent)">
您可以定义过滤器来执行相同的操作:
myApp.filter('children', function() {
return function(input, parent) {
var children = [];
for (var i = 0; i < input.length; i++) {
if (input[i].parent_id == parent.id) {
children.push(input[i]);
}
}
return children;
};
});
HTML:
<div ng-repeat="child in arr2|children:parent">
这两种方法都会执行每个摘要周期。如果您有大量元素,那么您肯定希望提高性能。我认为最好的方法是在获得它们时预处理这些结果,在arr1中只为其子项添加子数组(这里使用array.filter而不是for循环和array.forEach):
arr1.forEach(function(parent) {
parent.children = arr2.filter(function(value) {
return value.parent_id === parent.id;
};
});
然后在html中你已经在使用父级了,所以你可以重复它的子属性:
<div ng-repeat="child in parent.children">
答案 2 :(得分:0)
解决方案取决于阵列的更改频率以及阵列的大小。
第一种解决方案是使用过滤器。但在这种情况下,它至少会被调用两次(以确保结果是&#34;稳定&#34; - 选择相同的元素)。
其他解决方案是$watch
自己原创数组并准备&#34;查看&#34;它注入儿童的版本。我个人更喜欢第二个更明确。
但是,如果你可以重复使用&#34; find-the0child&#34;在应用程序的其他部分中过滤,您可以使用第一个 - AngularJS将仅在修改原始数组后重新运行过滤器。
如果需要,我可以在这里提供一个实施其中一个选项的例子 - 添加评论以回答。