AngularJS Charger des Données à partir du Service
Je vais avoir un problème à obtenir des données à partir d'un service peuplés dans mon point de vue. J'ai un service défini comme tel
app.factory('nukeService', function($rootScope, $http) {
var nukeService = {};
nukeService.nuke = {};
//Gets the list of nuclear weapons
nukeService.getNukes = function() {
$http.get('nukes/nukes.json')
.success(function(data) {
nukeService.nukes = data;
});
return nukeService.nukes;
};
return nukeService;
});
et mon contrôleur
function NavigationCtrl($scope, $http, nukeService){
/*$http.get('nukes/nukes.json').success(function(data) {
$scope.nukes = data;
});*/
$scope.nukes = nukeService.getNukes();
}
Si j'utilise le $http.obtenir du responsable du traitement des données remplit bien, mais, si j'essaie d'appeler les données à partir du service, je ne reçois rien. Je comprends que la requête est asynchrone, mais je vais avoir du mal à comprendre comment remplir le $portée variable une fois que les données sont retournées. Je pourrais utiliser $rootscope pour la diffusion d'un événement et d'écouter dans le contrôleur, mais cela ne semble pas le bon moyen pour y parvenir. Je voudrais vraiment apprécier toutes les conseils sur la façon de faire de la bonne façon.
Vous devez vous connecter pour publier un commentaire.
Je pense que cela devrait résoudre votre problème
C'est un problème avec la référence d'objet.
lorsque vous appelle
nukeService.getNukes()
vous obtenez une référence à un objeta
alors votre variable$scope.nukes
se réfère à cet emplacement de mémoire.Après le serveur distant appel lorsque vous définissez
nukeService.nukes = data;
vous n'êtes pas à changer l'objeta
au lieu de vous sont en train de changernukeService.nukes
d'objet de référencea
pour objetb
. Mais votre$scope.nukes
ne sais pas ce réaffectation et il reste des points à l'objeta
.Ma solution dans ce cas est de faire passer un objet
a
avec la propriétédata
et ensuite seulement de modifier les données de propriété au lieu de changer de référence poura
$scope.data
revient à null, depuisgetNukes()
retourne immédiatement, sans attendre le résultat de$http
.$http.get
retourne, pas de retour.data
(qui estnull
à ce point), à partir denukeService.getNukes
. Dans votre code, vous devez utiliserpromise.then
à fournir un rappel qui continuera votre flux de code, une fois la promesse en fait résout.Ce doit être comme suit. Comme mentionné par NickWiggill commentaire, undefined sera affecté à nukeService.des données si nous n'avons pas de retour à la promesse.
Ce que je fais c'est que je exposer les données directement depuis le service, et avoir une méthode qui initialise ces données. Ce qui est mal à cela?
Service:
Contrôleur: