2013-07-02 4 views
1

Новый для угловой и firebase. Я сталкиваюсь с ошибкой «TypeError: не может вызывать метод« дочерний »неопределенного« на начальной загрузке страницы ». Он не определен, потому что он еще не готов, но я не уверен, как справиться с ситуацией.ТипError: Невозможно вызвать метод 'child' of undefined

Сценарий следующим образом: 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    
    } 
}); 

Позже, в FriendsController, когда пользователь находится на/друзей маршрут

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

Ошибка возникает из списка друзейList, потому что refata userData не готов (я думаю). Навигация к/друзьям из других мест не имеет этой проблемы, только при загрузке страницы. Я ищу решения для обработки сценария. Спасибо.

Редактировать: дополнительные предложения, которые я пробовал, основываясь на предложениях до сих пор от Като и Ананта.

Использование обещание:

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', {}); 
    }); 

Это работает на странице загрузки, но не, если перейти на страницу, так как там больше не широковещательный событие «подлинности ». Кажется, это вводит другой вопрос. Как перемещаться в/друзья, чтобы загружать нужные данные?

ответ

2

Вам необходимо подождать, пока не будет вызван обратный вызов для authClient, как вы подозревали. Есть несколько решений этой проблемы.

Установить обещание

С Угловая не будет заботиться, если $ scope.friends неопределен, самый простой ответ может быть просто быть use a promise в authClient и ссылки, которые, прежде чем устанавливать друзей:

var def = $q.defer(); 
$rootScope.loginPromise = def.promise(); 
$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); 
     def.resolve(); 
    } else { 
     // user is logged out    
    } 
}); 

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

используйте модель наблюдателя

Другим решением будет использовать $ rootScope. $ вещать предупредить ваш CONTR oller, когда auth завершен.Тогда ваш FriendsController может прослушивать событие и делать свою работу соответствующим образом:

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

Аннотация аутентификации

Часто вы можете просто обрабатывать аутентификацию на уровне маршрута и не приходится иметь дело с ним в контроллерах (убедившись, что auth произошел, прежде чем они смогут достичь защищенных данных).

использовать библиотеку

Отъезд angularFire repo другие примеры всех этих и за хороший Lib, что можно абстрагироваться большая часть этой работы.

+0

Я также рекомендую посмотреть новую поддержку аутентификации, добавленную в angularFire, есть обзор того, как ее использовать здесь: https://groups.google.com/d/msg/firebase-talk/D6wgBgUtK94/AygqI4oJ7b4J – Anant

+0

Привет @ Като, спасибо за предложения. Я столкнулся с некоторыми проблемами с обещаниями и использованием модели наблюдателя и отредактировал свой ответ с моими результатами. Возможно, вы могли бы помочь мне с ними. Я также не смог получить аутентификацию angularFire, но я буду продолжать возиться, поскольку я многому учусь. Благодарю. – landland

+0

@ Обязательно следуя инструкциям в потоке группы google, я смог получить аутентификацию. Спасибо за инструкции, они были очень полезны. – landland

Смежные вопросы