如何使用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
(始终用于第一个比较) $digest
将dirty
设置为true
。 当所有的作用域被处理时,如果dirty == true
$digest
从$rootScope
开始另一个深度优先遍历。 $digest
在dirty == false或遍历数为10时结束。在后一种情况下,错误“10 $ digest()迭代到达”。 将被记录。
现在关于ngRepeat
。 对于每个watch.get
调用它将来自collection的对象(返回getEntities
值)与缓存中的HashQueueMap
信息( HashQueueMap
的hashKey
)一起存储。 对于每个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