2017-07-09 6 views
0

私の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; 
     }); 
    }; 
} 

Webページ:

<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()は、Webページから呼び出されたときに、10 $digest() iterations reachedエラーが生成されていることですWebページ上のデータはリアルタイムで更新されなくなりますFirebase DBにpdateされています。

どうすれば解決できますか?私はFirebase-Utilを見てきましたが、この場合に具体的にどのように利用するのかは不明です。 Firebase Docsから

答えて

0

パスでデータを読み込み、変更をリッスン、イベントを観察するためにfirebase.database.Referenceon()またはonce()メソッドを使用します。

リアルタイムで更新するには、on()メソッドを使用する必要があります。このメソッドは、リスナーがアタッチされると1回トリガーされ、子を含むデータが変更されるたびにトリガーされます。

お使いの場合には

、単にgetUserData()でFirebaseデータベース参照を返すことによって固定

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

ありがとう、しかしそれをon()に変更すると'10 $ digest( )iterations reached 'エラーが発生しました。 – user2181948

+1

[この回答](https://stackoverflow.com/a/17129274/7004388)が役に立ちます。提供されたリンクに投稿されたすべての回答を参照してください。 @ user2181948 – Chip

0

:NG-repeat`要素のng-init

<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> 
getUserData()を呼び出すその後

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

    return ref; 
}; 

関連する問題