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.
getData
só pode aceitar o obj
parâ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.data
com = {}
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
?