2013-09-10 2 views
2

Я пытаюсь получить длину массива простого angularFireCollection и не могу показаться:AngularFire Collection Длина

var stf = new FireBase("http://myfirebase-app.firebaseio.com/staff"); 

function staffListCtrl($scope, angularFireCollection){ 
    $scope.staff = angularFireCollection(stf); 
    console.log($scope.staff.length); 
} 

Выход в консоли говорит:

0 

Какой Я знаю, что это неверно. Оно должно быть возвращение где-то около 5 в длину (см скриншот ниже для вывода $scope.staff.

output of $scope.staff

Любая помощь является оценили как я не могу пройти мимо этого абсолютно, совершенно простая задача JS .

ответ

1

В этом случае, правильный способ печати количества извлекаемых элементов внутри обратного вызова будет следующее:

var stf = new FireBase("http://myfirebase-app.firebaseio.com/staff"); 
function staffListCtrl($scope, angularFireCollection) { 
    $scope.staff = angularFireCollection(stf, function() { 
     console.log(stf.numChildren()); 
    }); 
} 

Причина этого заключается в том, что начальная функцию обратного вызова вызывается до того фактических выполняется присвоение $ scope.staff. Таким образом, в функции обратного вызова вы можете получить доступ только к объекту Firebase DataSnapshot stf. Надеюсь это поможет.

0

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

var stf = new FireBase("http://myfirebase-app.firebaseio.com/staff"); 
function staffListCtrl($scope, angularFireCollection) { 
    $scope.staff = angularFireCollection(stf, function() { 
    console.log($scope.staff.length); 
    }); 
} 
+0

Только что узнал, что 'нг-шкура =«staff.length> 0» 'работает на мой взгляд, но не в контроллер. Извините за глупый вопрос, но я боролся с тем, почему я не мог получить длину в контроллере. Вопрос до сих пор остается без ответа, но я проверю его, как только смогу заставить его работать. Спасибо, @Anant! – seangates

+0

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

+0

Это не сработало, даже в обратном вызове. – seangates

0

ах, я вижу это в angularfire.js. Строка 298 обертывает добавление элемента в $ timeout. Это приводит к тому, что initalCb() получает вызов до того, как данные будут добавлены в коллекцию. Я вытащил $ timeout, и это сработало. Однако мне пришлось называть $ scope. $ Apply(), чтобы отразить добавленные элементы. Я закончил передачу области в angularFireCollection, чтобы убедиться, что $ apply() вызывается. Не знаю, что еще я сломал, потянув тайм-аут.

это вид вопроса: plunkr

EDIT: , насколько я могу сказать и показал в plunkr, это не работает.

$scope.staff = angularFireCollection(stf, function() { 
    console.log($scope.staff.length); 
}); 

и, потянув за $ таймаут от angularfire.js исправил этот конкретный вопрос, это вызвало все виды других головных болей с (привязки данных, как и ожидалось), так что я положил его обратно. Кажется, что нужно пойти, чтобы использовать моментальный снимок, который передается в обратном вызове. Я не могу найти много документации на него, но вот то, что работает для меня:

$scope.staff = angularFireCollection(stf, function(snapshot) { 
    angular.forEach(snapshot, function(item){ 
     //will let you iterate through the data in the snapshot 
    }); 
});