Piszę małą aplikację internetową Angular i mam problemy z ładowaniem danych. Używam Firebase jako źródła danych i znalazłem projekt AngularFire, który brzmiał ładnie. Mam jednak problem z kontrolowaniem sposobu wyświetlania danych.angularfireCollection: wiem, kiedy dane są w pełni załadowane
Początkowo próbowałem za pomocą regularnej synchronizacji niejawny wykonując:
angularFire(ref, $scope, 'items');
To działało w porządku, a wszystkie dane wyświetlane kiedy stosuje model $ items moim zdaniem. Jednak gdy dane docierają ze źródła danych Firebase, nie są one sformatowane w taki sposób, jaki obsługuje widok, więc muszę wprowadzić dodatkowe zmiany strukturalne danych przed ich wyświetleniem. Problem polega na tym, że nie wiem, kiedy dane zostały w pełni załadowane. Próbowałem przypisać zegarek $ do pozycji $, ale został on wywołany zbyt wcześnie.
Więc przeniósł się i starał się wykorzystać angularfireCollection Zamiast:
$scope.items = angularFireCollection(new Firebase(url), optionalCallbackOnInitialLoad);
dokumentacja nie jest jasne, co „optionalCallbackOnInitialLoad” czy i kiedy to się nazywa, ale próbuje uzyskać dostęp do pierwszego elementu w kolekcji $ items pojawi się błąd ("Uncaught TypeError: Can not read property" 0 "of undefined").
Próbowałem dodanie przycisku i kliknij przycisk obsługi w Zalogowałem treść pierwszej pozycji w $ przedmiotów, a pracował:
console.log($scope.items[0]);
Nie było! Pierwszy obiekt z mojej Bazy Firebase został wyświetlony bez żadnych błędów ... Jedynym problemem było to, że musiałem kliknąć przycisk, aby się tam dostać.
Więc, czy ktoś wie jak mogę wiedzieć kiedy wszystkie dane zostały załadowane i następnie przypisać ją do zmiennej zakres $ mają być wyświetlane w moim zdaniem? A może jest inny sposób?
Mój kontroler:
app.controller('MyController', ['$scope', 'angularFireCollection',
function MyController($scope, angularFireCollection) {
$scope.start = function()
{
var ref = new Firebase('https://url.firebaseio.com/days');
console.log("start");
console.log("before load?");
$scope.items = angularFireCollection(ref, function()
{
console.log("loaded?");
console.log($scope.items[0]); //undefined
});
console.log("start() out");
};
$scope.start();
//wait for changes
$scope.$watch('items', function() {
console.log("items watch");
console.log($scope.items[0]); //undefined
});
$scope.testData = function()
{
console.log($scope.items[0].properties); //not undefined
};
}
]);
moim zdaniem:
<button ng-click="testData()">Is the data loaded yet?</button>
Z góry dzięki!
spróbuj tego: angularFireCollection (ref, funkcja (dane) { $ scope.items = dane; console.log ($ zakres. items [0]); }); –