Je n'aime vraiment pas le fait que, en raison de la façon "prometteuse" de faire les choses, le consommateur du service qui utilise $ http doit "savoir" comment décompresser la réponse.
Je veux juste appeler quelque chose et extraire les données, comme à l'ancienne $scope.items = Data.getData();
, qui est maintenant obsolète .
J'ai essayé pendant un certain temps et je n'ai pas trouvé de solution parfaite, mais voici mon meilleur coup ( Plunker ). Cela peut être utile à quelqu'un.
app.factory('myService', function($http) {
var _data; // cache data rather than promise
var myService = {};
myService.getData = function(obj) {
if(!_data) {
$http.get('test.json').then(function(result){
_data = result.data;
console.log(_data); // prove that it executes once
angular.extend(obj, _data);
});
} else {
angular.extend(obj, _data);
}
};
return myService;
});
Puis contrôleur:
app.controller('MainCtrl', function( myService,$scope) {
$scope.clearData = function() {
$scope.data = Object.create(null);
};
$scope.getData = function() {
$scope.clearData(); // also important: need to prepare input to getData as an object
myService.getData($scope.data); // **important bit** pass in object you want to augment
};
});
Les défauts que je peux déjà repérer sont
- Vous devez passer l'objet auquel vous souhaitez ajouter les données , ce qui n'est pas un modèle intuitif ou courant dans Angular
getData
ne peut accepter le obj
paramètre que sous la forme d'un objet (bien qu'il puisse également accepter un tableau), ce qui ne sera pas un problème pour de nombreuses applications, mais c'est une limitation douloureuse
- Vous devez préparer l'objet d'entrée
$scope.data
avec = {}
pour en faire un objet (essentiellement ce qui $scope.clearData()
fait ci-dessus), ou = []
pour un tableau, ou cela ne fonctionnera pas (nous devons déjà supposer quelque chose sur les données qui arrivent). J'ai essayé de faire cette étape de préparation IN getData
, mais pas de chance.
Néanmoins, il fournit un modèle qui supprime le passe-partout "promettre le déballage" du contrôleur, et peut être utile dans les cas où vous souhaitez utiliser certaines données obtenues à partir de $ http à plusieurs endroits tout en le maintenant SEC.
then
?