2015-01-26 3 views
1

В настоящее время я использую AngularFire и пытаюсь получить длину объектов в моей базе данных.Невозможно получить длину объектов Firebase

В моей Firebase структура выглядит

popping-fire-5575 
    celio 
    -JgaQt-tNq-gRVIVZdCD 
    artist: 
    track: 
    -JgaQuBoYk9VX3pWylx3 
    artist: 
    track: 
    -JgaQuf_pyBFJ7EA1Fo_ 
    artist: 
    track: 

В мой контроллер,

var profileObject = FirebaseDemo.getBroadcast($routeParams.param); 
var twotwo = profileObject.$asObject(); 
twotwo.$bindTo($scope, 'data'); 

Когда я утешаю войти переменную 'twotwo', я получаю взамен

Object 
$$conf: Object 
$id: "celio" 
$priority: null 
-JgaQt-tNq-gRVIVZdCD: Object 
-JgaQuBoYk9VX3pWylx3: Object 
-JgaQuf_pyBFJ7EA1Fo_: Object 
__proto__: Object 

Однако, я пробовал всевозможные способы получить длину, но я не могу преуспеть. Может ли кто-нибудь дать мне несколько советов или подсказок?

+0

Не связанный с моим ответом ниже: У меня создается впечатление, что ваш вопрос основан на каком-то учебнике или классе. Если это так, можете ли вы указать мне на учебник/класс? Я хотел бы прочитать немного больше об этом, так как вы не первый человек, застрявший в задании, и, возможно, мы сможем сделать что-то, чтобы помочь людям с заданием более структурно. –

+0

Объекты не имеют длины. Массивы. Кроме того, [это руководство] (https://www.firebase.com/docs/web/libraries/angular/guide.html), вероятно, лучше всего для начала, поскольку оно объясняет основные основы AngularFire, такие как объекты и массивы , Я также хотел бы узнать, кто издает этот урок. Это меня озадачивает, почему официальная документация является таким последним средством, и почему так много людей, борющихся с такими фундаментальными принципами, как объекты JavaScript, не имеющие атрибута .length, так часто пытаются завоевать Angular и Firebase все в первый день. – Kato

ответ

1

Firebase загружает (и синхронизирует) ваши данные асинхронно, поэтому к тому моменту, когда выполняется ваш оператор console.log, он, вероятно, все еще занят загрузкой данных.

К счастью AngularFire есть способ уведомления и запустить свой код, когда начальная загрузка данных завершена:

var twotwo = profileObject.$asArray(); 
twotwo.$loaded().then(function(data) { 
    console.log('Initial data loaded', data.length); 
}); 

Два основных изменений из кода:

  1. Использование $asArray() вместо $asObject() , так как ваша структура данных представляет собой массив
  2. Слушайте $loaded «событие» и ответьте на это сообщение

Обратите внимание, что AngularFire уже уведомит AngularJS о любых изменениях данных, поэтому вам не придется отвечать на $loaded, если вы просто привязываете данные к $scope и показываете их в своем представлении.

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