2016-01-24 3 views
0

Я пытаюсь получить данные из firebase и его в формате этого:не может извлекать данные из firebase

>Users 
--->UID 
------>email: 
------>height: 
------>etc... 

По какой-то причине UID продолжает возвращаться неопределенными, когда я пытаюсь получить значение скажите электронную почту. Это код, который пытается получить данные:

.factory('Chats', function($rootScope) { 
    // Might use a resource here that returns a JSON array 
    var chats; 

    return { 
    all: function() { 
     return chats; 
    }, 
    initialize: function(isLoggedIn) { 

     var data = $rootScope.ref.getAuth().uid; 
     console.log("initialize: " + data); 
     if(isLoggedIn == true) { 
     $rootScope.ref.on("value", function(snapshot) { 
      console.log("Value: " + snapshot.val()); 
      console.log("Users: " + snapshot.val().users); 
      console.log("Data: " + snapshot.val().users.data.email); 
     }, function (errorObject) { 
      console.log("The read failed: " + errorObject.code); 
     }); 
     } 
} 
}; 
}) 

Он ломает, когда он получает третий console.log («данные» один), он генерирует исключение, говоря:

Cannot read property 'email' of undefined 

Но когда я регистрирую переменную data1 непосредственно перед оператором if, он возвращает правильный UID пользователя в виде строки, поэтому я не понимаю, почему он говорит мне, что он не определен. Все, что я пытаюсь сделать, это выкапывать дерево firebase и извлекать значения пользователей (по электронной почте, высоте и т. Д.) На основе UID пользователя, которые я получаю, вызывая ref.getAuth(). Uid.

Спасибо, продвинутый!

ответ

0

Вы читаете корень вашего Firebase, а затем попытаться получить доступ к:

snapshot.val().users.data.email 

что соответствует:

/users/data/email 

Если вы проверить свои данные в формате JSON, вы увидите, что /users не имеет дочернего узла, который называется data. Для того, чтобы использовать значение данных, необходимо использовать кронштейн обозначения:

snapshot.val().users[data].email 

Обратите внимание, что вы загружаете путь больше данных, чем вы должны с вашим подходом. Ваши пользователи будут, вероятно, оценят его, если вы только загрузить свои данные из базы данных, которые вы можете сделать с:

$rootScope.ref.child("users").child(data).on("value", function(snapshot) { 
    console.log("Data: " + snapshot.val().email); 
}, function (errorObject) { 
    console.log("The read failed: " + errorObject.code); 
}); 

Конечная точка: если вы связываете адрес электронной почты, $scope, вы обнаружите, что угловые взгляды дон «Немедленно поднимите его. Это связано с тем, что код в вашем обратном вызове on() называется асинхронно, и к этому времени AngularJS больше не знает ваших действий. Вы можете узнать, как заставить AngularJS знать об изменениях в этом ответе: Firebase callbacks and AngularJS. Но, альтернативно, рассмотрите возможность использования AngularFire, чтобы избежать этой проблемы.

+0

Эй, Фрэнк, спасибо за ваш ответ - это сработало! Быстрый вопрос, хотя есть ли способ в Angular ждать Firebase для извлечения данных, прежде чем перейти к следующей строке кода? Код находится в моем service.js и возвращает объект с информацией о пользователях - мой контроллер вызывает службу. Мой контроллер затем устанавливает возвращаемое значение службы в переменную, но похоже, что контроллер не дожидается возврата службы, поэтому он устанавливает неопределенную переменную. – MatTaNg

+0

Там (к счастью) нет способа заставить код ждать данных, которые асинхронно загружаются в браузере. Прочитайте последние две ссылки в моем ответе о способах решения этой проблемы. –

+0

Изучите функции async, используя синтаксис async/wait. Это на этапе 3 процесса стандартизации ECMAScript. Это позволяет вам писать код, как если бы он был синхронным, оставаясь асинхронным, поэтому @MatTaNg, вы можете позвонить в Firebase, и ваш код будет «ждать» перед выполнением следующей строки, хотя под капотом это фактически ничего не блокирует. – lastmjs