0

Ich benutze Ionic für meine App mit einer Verbindung zu Firebase, um Daten zu ziehen. Ich habe ein Versprechen in einer Fabrik erstellt, Daten herunter zu ziehen und dachte, dass es die Daten auf dem Bildschirm wiedergeben sollte, sobald es fertig ist, aber ich bekomme nichts, bis ich den Bildschirm berühre.Daten von ES6 Versprechen wird nicht auf der Seite gerendert, bis ich darauf klicke?

Ich bekomme keinen Fehler und die Daten kommen tatsächlich.

Factory:

all: function() { 
      return new Promise ((resolve, reject) => { 
      firebase.database().ref('desks').once('value').then(snapshot => { 
       let desks = [] 
       snapshot.forEach((child) => { 
       desks.push(child.val()); 
       }); 
       resolve(desks) 
      }); 
      }); 

} 

Aufruf der Fabrik:

Office.all().then(function (data) { 
    console.log(data); 
    $scope.officeList = data; 
}); 

Ich glaube, ich bin es falsch anrufen oder aber es ist eine ionische Methode, die ich nicht zu finden scheinen.

Wie kann ich die Daten rendern lassen, wenn die Anfrage abgeschlossen ist?

Vielen Dank im Voraus

+0

Diskutiert so viele Male. Promise-Callbacks werden außerhalb des Angular-Bereichs ausgeführt, so dass * dirty checking * nicht funktioniert und Bindungen nicht aktualisiert werden. Verwenden Sie einfach '$ scope. $ Apply();' nach dem Zuweisen von Daten '$ scope.officeList = data;' –

+0

Danke, ich werde es versuchen. Ich bin mir nicht sicher, warum ich bei der Suche nicht darauf gestoßen bin: /. In der Hoffnung, die Reaktion ein wenig zu verändern, hoffentlich wird es sauberer. – SmiffyKmc

Antwort

1

ES6 Versprechungen sind nicht mit dem AngularJS Framework integriert. Verwenden Sie $q.when, um ES6-Versprechen zu AngularJS-Versprechen zu konvertieren. Nur Operationen, die in der AngularJS Ausführungskontext angewendet werden, werden von AngularJS profitieren Datenbindung, Ausnahmebehandlung, das Eigentum zu beobachten usw.

all: function() { 

     ̶r̶e̶t̶u̶r̶n̶ ̶n̶e̶w̶ ̶P̶r̶o̶m̶i̶s̶e̶ ̶(̶(̶r̶e̶s̶o̶l̶v̶e̶,̶ ̶r̶e̶j̶e̶c̶t̶)̶ ̶=̶>̶ ̶{̶   
    var es6promise = firebase.database() 
     .ref('desks').once('value') 
     .then(snapshot => { 
      let desks = [] 
      snapshot.forEach((child) => { 
      desks.push(child.val()); 
      }); 
      ̶r̶e̶s̶o̶l̶v̶e̶(̶d̶e̶s̶k̶s̶)̶ 
      return desks; 
    }); 

    return $q.when(es6promise); 
} 

Vermeiden Sie auch Promise(resolve,reject mit neuen Versprechungen zu erstellen. Verwenden Sie stattdessen das Versprechen, das von .then method zurückgegeben wird. Sie gibt eine neue Zusage zurück, die über den Rückgabewert successCallback, errorCallback aufgelöst oder zurückgewiesen wird (es sei denn, es handelt sich um eine Zusage, in diesem Fall wird sie mit dem Wert aufgelöst, der in dieser Zusage mit promise chaining aufgelöst wird).

Weitere Informationen finden Sie unter You're Missing the Point of Promises.

Verwandte Themen