【问题标题】:AngularFire '10 $digest() iterations reached' error when retrieving data from multiple nodes从多个节点检索数据时出现 AngularFire '10 $digest() 迭代次数达到'错误
【发布时间】:2017-12-13 14:29:23
【问题描述】:

我的 Web 应用程序使用 Firebase JS 和 AngularJS 来显示事件注册列表以及已注册每个事件的用户。事件和用户数据在不同的数据库节点中。

数据库:

"event_registrations" : {
    "$event_id" : {
        "$user_id" : {
           "registration_date" : "..." 
           "total_amount" : "...",
        }
    }
},

"users" : {
    "$user_id" : {
      "events" : {
        "event_id" : 1
      },
      "profile" : {
        "email" : "..."
        "name" : "...",
        // ...
      }
    },
}

角度:

function MyController($scope, $firebaseObject) {
    // Retrieve event data
    $scope.events = scope.firebaseRef.child('event_registrations');

    // Retrieve user_data
    $scope.getUserData = function(userID) {
        var ref = $firebaseObject(scope.firebaseRef
           .child('users')
           .child(userID)
           .child('profile'));

        ref.$ref().once("value", function(dataSnapshot) {
            var data = dataSnapshot.val();
            $scope.user_data = data;
        });
    };
 }

网页:

 <div ng-repeat="event in event_registrations">
    <table>
        <tr>
            <tr ng-repeat="(user_id, user_data) in event">
                {{getUserData(user_id)}}

                <td>{{user_data.email}}</td>
                <td>{{user_data.name}}</td>
            </tr>
        </tbody>
    </table>
</div>

问题是当从网页调用getUserData()时,会产生10 $digest() iterations reached错误,并且网页上的数据在Firebase DB中更新时停止实时更新。

如何解决?我看过 Firebase-Util,但不确定在这种情况下如何专门使用它。

【问题讨论】:

    标签: angularjs firebase firebase-realtime-database angularfire


    【解决方案1】:

    来自Firebase Docs

    要读取路径上的数据并监听变化,请使用firebase.database.Referenceon()once() 方法来观察事件。

    为了实时更新,您应该使用on() 方法。此方法在附加侦听器时触发一次,并且在每次数据(包括子项)更改时再次触发。

    在你的情况下,

    ref.$ref().on("value", function(dataSnapshot) {
            var data = dataSnapshot.val();
            $scope.user_data = data;
        });
    

    【讨论】:

    • 谢谢,但将其更改为 on() 仍会产生“10 $digest() 迭代次数达到”错误。
    • This answer 可能会对您有所帮助。请参阅提供的链接中发布的所有答案。 @user2181948
    【解决方案2】:

    只需在 getUserData() 中返回 Firebase 数据库引用即可修复:

     $scope.getUserData = function(userID) {
        var ref = $firebaseObject(scope.firebaseRef
            .child('users')
            .child(userID)
            .child('profile'));
    
        return ref;
    };
    

    然后在 ng-repeat` 元素的ng-init 中调用getUserData()

    <tr ng-repeat="(user_id, user_data) in event" ng-init="user_data=getUserData(user_id)>
          <td>{{user_data.email}}</td>
          <td>{{user_data.name}}</td>
    </tr>
    

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 2015-05-07
      • 1970-01-01
      • 2015-11-11
      • 2015-05-30
      • 2013-11-10
      • 2013-06-11
      • 2012-11-30
      • 1970-01-01
      相关资源
      最近更新 更多