Maison > Questions et réponses > le corps du texte
因为觉得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初始化的时候把从服务器取一些值之后可以一直用
習慣沉默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.data
Au 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 :
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
Rappel asynchrone. Utilisez factory
pour renvoyer une fonction de rappel, comme ceci :
javascript
xxx.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); });
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 :
javascript
xxx.factory('some', function($q, $http){ return $http.get(''); }); ... some.success(function(data){ console.log(data); });
某草草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...
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.