如何使用ng循环由函数返回的项目

我想重复创建div,这些项目是由函数返回的对象。 但是,以下代码报告错误:已达到10次摘要()迭代。 中止! jsfiddle在这里:http://jsfiddle.net/BraveOstrich/awnqm/

<body ng-app>
  <div ng-repeat="entity in getEntities()">
    Hello {{entity.id}}!
  </div>
</body>

简短的回答 :你真的需要这样的功能,或者你可以使用财产? http://jsfiddle.net/awnqm/1/

长答案

为了简单起见,我将只描述你的情况 - 对象数组的ngRepet。 另外,我会省略一些细节。

AngularJS使用脏检查来检测变化。 当应用程序启动时,它为$rootScope运行$digest$digest将为作用域的层次结构执行深度优先遍历。 所有范围都有手表列表。 每个手表都有最后一个值(最初为initWatchVal )。 对于所有手表的$digest运行它,获取当前值( watch.get(scope) )并将其与watch.last进行比较。 如果当前值不等于watch.last (始终用于第一个比较) $digestdirty设置为true 。 当所有的作用域被处理时,如果dirty == true $digest$rootScope开始另一个深度优先遍历。 $digest在dirty == false或遍历数为10时结束。在后一种情况下,错误“10 $ digest()迭代到达”。 将被记录。

现在关于ngRepeat 。 对于每个watch.get调用它将来自collection的对象(返回getEntities值)与缓存中的HashQueueMap信息( HashQueueMaphashKey )一起存储。 对于每个watch.get调用ngRepeat尝试通过缓存中的hashKey获取对象。 如果它不存在于缓存中, ngRepeat将它存储在缓存中,创建新的作用域,将对象放在缓存中,创建DOM元素等。

现在关于hashKey 。 通常, hashKey是由nextUid()生成的唯一编号。 但它可以是功能。 hashKey在生成后存储在对象中以供将来使用。

为什么你的例子产生错误 :函数getEntities()总是返回具有新对象的数组。 该对象没有hashKey ,并且不存在于ngRepeat缓存中。 因此,每个ngRepeat上的watch.get{{entity.id}}新手表生成新的范围。 第一个watch.get上的该手表具有watch.last == initWatchVal 。 所以watch.get() != watch.last 。 所以$digest开始新的遍历。 所以ngRepeat用新手表创建新的范围。 所以......经过10次遍历后你会得到错误。

你如何解决它

  • 不要在每个getEntities()调用中创建新的对象。
  • 如果你需要创建新的对象,你可以为它们添加hashKey方法。 有关示例,请参阅此主题。
  • 希望那些了解AngularJS内部构件的人纠正我,如果我在某些方面有错误的话。


    在重复之外初始化数组

    <body ng-app>
       <div ng-init="entities = getEntities()">
           <div ng-repeat="entity in entities">
               Hello {{entity.id}}!
           </div>
       </div>
    </body>
    

    这是在这里报道并得到了这样的回应:

    你的getter不是幂等的并且改变了模型(每次调用时都会生成一个新的数组)。 这迫使角度继续调用它,希望模型最终能稳定下来,但它永远不会放弃角色并抛出异常。

    吸气剂返回值相等但不相同,这就是问题所在。

    如果将阵列移到主控制器外部,您可以看到这种行为消失:

    var array = [{id:'angularjs'}];
    function Main($scope) {
        $scope.getEntities = function(){return array;};
    };
    

    因为现在它每次都返回相同的对象。 您可能需要重新构建您的模型,以便在范围中使用属性而不是函数:

    我们通过将控制器的方法的结果分配给一个属性来解决这个问题,然后执行ng:repeat。

    链接地址: http://www.djcxy.com/p/23121.html

    上一篇: How to Loop through items returned by a function with ng

    下一篇: model binding not updating when changed with jQuery