1

angular と firebase の新機能。最初のページ読み込み時に「TypeError: メソッド 'child' を未定義で呼び出せません」というエラーが発生します。まだ準備ができていないため未定義ですが、状況をどのように処理するかはわかりません。

シナリオは次のとおりです。 1. ユーザーがログインする 2. Firebase がユーザーがログインしていることを確認する 3. ユーザーが子の「友達」の友達リストを持っている 4. Firebase がユーザーを確認する前に、コードが子の「友達」を取得しようとする

ログインするためのコード

    $rootScope.userRef = $rootScope.fireRef.child('users');
    $rootScope.authClient = new FirebaseAuthClient($rootScope.fireRef, function(error, user) {
    if (error) {
        // an error occurred while attempting login
        console.log(error);
    } else if (user) {
        // user authenticated with Firebase              
        $rootScope.userData = $rootScope.userRef.child(user.id);
    } else {
        // user is logged out             
    }
});

後で、ユーザーが /friends ルートにいるときの FriendsController で

   var friendsList = $scope.userData.child('friends'); 
   var promise = angularFire(friendsList.limit(10), $scope, 'friends', {}); 

userData ref の準備ができていないため、friendsList でエラーが発生します (と思います)。他の場所から /friends に移動してもこの問題は発生せず、ページの読み込み時にのみ発生します。シナリオを処理するためのソリューションを探しています。ありがとうございました。

編集:加藤とアナントからのこれまでの提案に基づいて、私が試した追加の提案。

promise を使用する:

    var def = $q.defer();
    $rootScope.loginPromise = def.promise;
    // then in authclient
    def.resolve();

次に、友達のコントローラーで:

    $rootScope.loginPromise.then(function() {
       var friendsList = $scope.userData.child('friends'); 
       var promise = angularFire(friendsList.limit(10), $scope, 'friends', {}); 
    });

これにより、友達リストが読み込まれません。興味深いことに、メニュー ボタンをクリックすると loginPromise が実行されます。これは私が期待したものではありません。なぜこれが考えられるのでしょうか?

オブザーバー モデルを使用します。

   $rootScope.broadcast('authenticated') // in user verification

FriendsController で:

    $rootScope.$on('authenticated', function() {
      var friendsList = $scope.userData.child('friends'); 
      var promise = angularFire(friendsList.limit(10), $scope, 'friends', {}); 
    });

これはページの読み込みでは機能しますが、「認証済み」のイベント ブロードキャストがなくなったため、ページに移動する場合は機能しません。したがって、これにより別の質問が発生するようです。目的のデータが読み込まれるように /friends に移動する方法は?

4

1 に答える 1