Restangular嵌套子查询无限循环

时间:2017-02-15 17:19:03

标签: angularjs restangular

我需要运行一个查询来检索每个父项的子项列表。

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。

1 个答案:

答案 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变量。