例如,我想制作一个如下所示的列表:
Apple - Steve Jobs
Microsoft - Bill Gates
Tesla - Elon Musk
我将使用两个Firebase应用程序和AngularJS来执行此操作。
第一个FB应用程序看起来像:
companies
|_Apple: 0
|_Microsoft: 0
|_Tesla: 0
第二个FB应用程序:
companies-ceo
|_Apple: "Steve Jobs"
|_Microsoft: "Bill Gates"
|_Tesla: "Elon Musk"
所以我有一个AngularJs应用程序:
angular.module('App', ["firebase"])
.controller('AppCtrl', ['$scope', '$firebaseObject',
function($scope,$firebaseObject){
var userRef = new Firebase('https://companies.firebaseio.com/');
var userObj = $firebaseObject(userRef);
userObj.$bindTo($scope, "userData");
$scope.getCEO = function(companyName){
var indexRef = new Firebase('https://companies-ceo.firebaseio.com/'+companyName);
var indexObj = $firebaseObject(indexRef);
indexObj.$loaded(function(){
return indexObj.$value;
})
};
}])
HTML代码:
<div ng-controller="AppCtrl">
<div ng-repeat="(companyName,tmp) in userData">
<p>{{companyName}} - {{getCEO(companyName)}}</p>
</div>
</div>
当我不使用getCEO()函数时,如:
<div ng-controller="AppCtrl">
<div ng-repeat="(companyName,tmp) in userData">
<p>{{companyName}}</p>
</div>
</div>
一切都很好,但是使用getCEO()函数会导致错误:
Error: 10 $digest() iterations reached. Aborting!
我该如何解决?
答案 0 :(得分:3)
因为您在getCEO(companyName)
指令中调用{{}}
来评估每个摘要周期,这会导致摘要周期达到其限制并引发错误。而不是这样做我建议你在getCEO(companyName)
的div渲染时间上调用ng-repeat
方法,但我会在这里使用ng-init
<强>标记强>
<div ng-repeat="(companyName,tmp) in userData" ng-init="ceo=getCEO(companyName)">
<p>{{companyName}} - {{ceo}}</p>
</div>
或强>
另一个很好的例子是使用::
bindonce指令将运行指定的方法只运行一次。使用此指令getCEO(companyName)
方法只会调用一次。
<强>标记强>
<div ng-repeat="(companyName,tmp) in userData">
<p>{{companyName}} - {{::getCEO(companyName)}}</p>
</div>
注: - Bindonce
::
指令需要Angular 1.3+版本