很多firebase查询导致“10 $ digest()迭代达到”错误

时间:2015-06-20 20:04:04

标签: angularjs firebase angularfire

例如,我想制作一个如下所示的列表:

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!

我该如何解决?

1 个答案:

答案 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+版本