recherche

Maison  >  Questions et réponses  >  le corps du texte

angular.js - 怎么在angular初始化时$http为factory赋初值

因为觉得factory是单例的所以把http结果作为factory的返回值,怎么做到在angular初始化时$http为factory赋初值?
angular.module('some',[]) .factory('factory',function($http){ var some = {}; $http.get('url') .success(function(resp){ some.data = resp; }) return some.data; })
现在类似是这样写的,我就希望angular初始化的时候把从服务器取一些值之后可以一直用

phpcn_u1582phpcn_u15822744 Il y a quelques jours742

répondre à tous(4)je répondrai

  • 習慣沉默

    習慣沉默2017-05-15 16:56:00

    Je crois que vous avez également découvert que le problème avec votre écriture est que l'acquisition de données est asynchrone. some.dataAu début c'était encore undefined. Mais votre intuition est bonne : les données communes doivent être placées à l'intérieur de factory ou service. Maintenant pour résoudre le problème asynchrone, il existe trois solutions :

    1. Convertir pour synchroniser. C'est la solution la plus directe. Les données requises sont directement restituées dans le modèle côté serveur factory obtient les données du HTML, généralement en utilisant la balise input. Dans cette optique, une meilleure façon consiste à configurer les ressources avant de démarrer l’application Angular. Vous pouvez vous référer à cet article : http://harttle.github.io/2015/05/31/angular-scope-initialize.html#1

    2. Rappel asynchrone. Utilisez factory pour renvoyer une fonction de rappel, comme ceci :

      javascriptxxx.factory('some', function($http){
          var some = {}
          function get(cb){       
              if(some.data) return cb(some.data);     
              $http.get('').success(function(d){
                  cb(some.data = d);
              });
          }
          return get;
      });
      ...
      some.get(function(data){
          console.log(data);
      });
      
    3. Utilisez le mode Promesse/Différé pour un fonctionnement asynchrone. Alors que les projets deviennent de plus en plus complexes, Promise est la solution ultime. Angular fournit l'implémentation de ce modèle $q, qui est un service, et $http.get renverra une instance Promise. Utilisé comme ceci :

      javascriptxxx.factory('some', function($q, $http){
          return $http.get('');
      });    
      ...
      some.success(function(data){
          console.log(data);
      });
      

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-15 16:56:00

    angulaire.run(fn)

    répondre
    0
  • 某草草

    某草草2017-05-15 16:56:00

    angularjs $http ne prend pas en charge l'acquisition synchrone

    Vous souhaitez initialiser ou afficher une réponse.write du backend vers le frontend
    Ou utilisez le blocage ajax de jquery pour obtenir les données puis initialisez angulaire
    Pour le routage, vous pouvez utiliser solve pour injecter le contrôleur

    http://stackoverflow.com/questions/16286605/initialize-angularjs-servi...

    répondre
    0
  • PHPz

    PHPz2017-05-15 16:56:00

    Il existe des milliers de méthodes d'initialisation. La clé n'est pas de savoir si la valeur souhaitée est obtenue de manière synchrone ou asynchrone, mais où et quand l'utilisez-vous ? L'orientation vers l'objectif détermine la méthode que vous utilisez pour l'initialisation. Bien entendu, l’utilisation de promesses est recommandée dans la plupart des cas.

    répondre
    0
  • Annulerrépondre