Eu realmente não gosto do fato de que, devido à maneira "promissora" de fazer as coisas, o consumidor do serviço que usa $ http precisa "saber" sobre como descompactar a resposta.
Eu só quero chamar alguma coisa e divulgar os dados, de maneira semelhante à antiga $scope.items = Data.getData();, que agora está obsoleta .
Tentei por um tempo e não achei uma solução perfeita, mas aqui está minha melhor chance ( Plunker ). Pode ser útil para alguém.
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;
});
Então controlador:
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
};
});
As falhas que eu já consigo identificar são
- Você precisa passar o objeto ao qual deseja adicionar os dados , o que não é um padrão intuitivo ou comum no Angular.
getDatasó pode aceitar o objparâmetro na forma de um objeto (embora também possa aceitar uma matriz), o que não será um problema para muitos aplicativos, mas é uma limitação dolorida
- Você tem que preparar o objeto de entrada
$scope.datacom = {}a torná-lo um objeto (essencialmente o que $scope.clearData()faz acima), ou = []para um array, ou não vai funcionar (já estamos tendo que assumir algo sobre os dados que entram). Eu tentei fazer este passo de preparação getData, mas sem sorte.
No entanto, ele fornece um padrão que remove o clichê do controlador "promete desembrulhar" e pode ser útil nos casos em que você deseja usar determinados dados obtidos a partir de $ http em mais de um local, mantendo-o SECO.
then?