Ich schreibe eine kleine Angular Web-Anwendung und habe Probleme beim Laden der Daten bekommen. Ich benutze Firebase als Datenquelle und finde das AngularFire-Projekt, das gut klingt. Ich habe jedoch Probleme, die Anzeige der Daten zu steuern.angularfireCollection: wissen, wenn die Daten vollständig geladen sind
Zuerst habe ich versucht, die regelmäßige implizite Synchronisation mit, indem Sie:
angularFire(ref, $scope, 'items');
Es funktionierte gut und alle Daten angezeigt wurde, als ich das Modell $ Artikel aus meiner Sicht verwendet. Wenn die Daten jedoch von der Firebase-Datenquelle ankommen, werden sie nicht so formatiert, wie es die Ansicht unterstützt. Daher muss ich die Daten vor der Anzeige noch strukturell verändern. Das Problem ist, ich weiß nicht, wann die Daten vollständig geladen wurden. Ich habe versucht, den $ Items eine $ Watch zuzuordnen, aber es wurde zu früh aufgerufen.
So zog ich auf und versuchte, die angularfireCollection zu verwenden, anstatt:
$scope.items = angularFireCollection(new Firebase(url), optionalCallbackOnInitialLoad);
Die Dokumentation ist nicht ganz klar, was die „optionalCallbackOnInitialLoad“ tut und wenn sie aufgerufen wird, sondern versucht, das erste Element zuzugreifen in der $ items-Sammlung wird einen Fehler auslösen ("Uncaught TypeError: Kann die Eigenschaft '0' von undefined nicht lesen").
Ich habe versucht, das Hinzufügen einer Schaltfläche und in der Click-Handler der Schaltfläche angemeldet ich den Inhalt des ersten Elements der Elemente $, und es arbeitete:
console.log($scope.items[0]);
Es wurde! Das erste Objekt aus meiner Firebase wurde ohne Fehler angezeigt ... Das Problem ist nur, dass ich auf eine Schaltfläche klicken musste, um dorthin zu gelangen.
So, weiß jemand, wie ich wissen kann, wenn alle Daten geladen wurde und dann es auf eine Variable $ Rahmen zuweisen meiner Ansicht angezeigt werden? Oder gibt es einen anderen Weg?
Mein Controller:
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
};
}
]);
Meine Ansicht:
<button ng-click="testData()">Is the data loaded yet?</button>
Vielen Dank im Voraus!
versuchen, dieses: angularFireCollection (ref, Funktion (Daten) { $ scope.items = data; console.log ($ Umfang. Artikel [0]); }); –