我需要运行一个查询来检索每个父项的子项列表。
HTML:
<tr ng-repeat="parent in parents">
<td>{{parent.id}}</td>
<td>{{parent.name}}</td>
<td>
<li ng-repeat="child in getChildren(parent.id)">
{{child}}
</li>
</td>
</tr>
JS:
app.controller('mainCtrl', function($scope, Restangular) {
...
$scope.getChildren = function(parentId) {
console.log(parentId); //called over and over
//should GET e.g. /api/parents/1/children
return Restangular.one('parents', parentId).getList('children').then(function(children) {
console.log(JSON.stringify(children)); //never hit
return children;
})
}
我可以看到正在调用正确的API端点,但是对同一个parentId重复调用getChildren()函数。它似乎也永远不会回归。我确定它显而易见 - 我做错了什么?
似乎与此相关:Infinite loop with Angular expression binding但是该示例不使用Restangular。
答案 0 :(得分:1)
我不确定它为什么会无限运行。它可能与AngularJs的消化周期有关。
为了完全避免这个问题,一个解决方案可能是:
您有一个$scope.parents
变量。从该变量(或至少一次初始化)你可以做到:
$scope.children = {};
for (var parent in $scope.parents) {
// store parent id for easy access
var parentId = $scope.parents[parent].id;
// get the children
Restangular.one('parents', parentId).getList('children')
.then(function(children) {
// access the parentResource object of the returned object to
// get the parent id
$scope.children[children.parentResource.id] = children;
})
}
这样,子对象可以通过对象访问(由父对象键控)。然后在你的HTML中,你有:
<li ng-repeat="child in children[parent.id]"></li>
而不是进行函数调用,你只需要访问$ scope变量。