0

J'utilise Ionic pour mon application avec une connexion à Firebase pour extraire des données. J'ai créé une promesse dans une usine de tirer des données vers le bas et je pensais qu'il devrait rendre les données sur l'écran une fois qu'il se termine, mais je ne reçois rien jusqu'à ce que je touche l'écran?Les données de promesse ES6 ne rend pas sur la page jusqu'à ce que je clique dessus?

Je n'obtiens aucune erreur et les données viennent en effet.

usine:

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) 
      }); 
      }); 

} 

Appeler l'usine:

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

Je sens que je appelle mal ou bien il existe une méthode ionique que je ne peux pas sembler trouver.

Comment vais-je pouvoir rendre les données une fois la requête terminée?

Merci à l'avance

+0

Discuté de nombreuses fois. Les rappels de promesse sont exécutés en dehors de la portée d'Angular, ainsi * la vérification sale * ne fonctionne pas et les liaisons ne sont pas mises à jour. Il suffit d'utiliser '$ scope. $ Apply();' après avoir assigné des données '$ scope.officeList = data;' –

+0

Merci, je vais essayer. Je ne sais pas pourquoi je ne l'ai pas trouvé en le cherchant: /. Espérant déplacer la réaction indigène quelque temps alors j'espère que ce sera plus propre. – SmiffyKmc

Répondre

1

ES6 promesses ne sont pas intégrées dans le cadre de AngularJS. Utilisez $q.when pour convertir ES6 promet aux promesses AngularJS. Seules les opérations qui sont appliquées dans le contexte d'exécution AngularJS bénéficieront de AngularJS données de liaison, la gestion des exceptions, la propriété regarder, etc.

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); 
} 

Évitez également d'utiliser Promise(resolve,reject pour créer de nouvelles promesses. Utilisez plutôt la promesse retournée par le .then method. Il renvoie une nouvelle promesse qui est résolue ou rejetée via la valeur de retour du successCallback, errorCallback (à moins que cette valeur ne soit une promesse, auquel cas elle est résolue avec la valeur qui est résolue dans cette promesse en utilisant promise chaining). Pour plus d'informations, voir You're Missing the Point of Promises.