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 に移動する方法は?