Non mi piace davvero il fatto che, a causa del modo "promettente" di fare le cose, il consumatore del servizio che utilizza $ http deve "sapere" su come decomprimere la risposta.
Voglio solo chiamare qualcosa e ottenere i dati, in modo simile al vecchio $scope.items = Data.getData();modo, che ora è deprecato .
Ho provato per un po 'e non ho trovato una soluzione perfetta, ma ecco il mio colpo migliore ( Plunker ). Potrebbe essere utile a qualcuno.
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;
});
Quindi controller:
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
};
});
I difetti che posso già individuare sono
- Devi passare l'oggetto a cui desideri aggiungere i dati , che non è un modello intuitivo o comune in Angolare
getDatapuò accettare il objparametro solo nella forma di un oggetto (anche se potrebbe anche accettare un array), il che non sarà un problema per molte applicazioni, ma è un limite irritato
- Devi preparare l'oggetto di input
$scope.datacon = {}per renderlo un oggetto (in sostanza quello che $scope.clearData()fa sopra), o = []per un array, o non funzionerà (stiamo già di dover assumere qualcosa su quali dati vengono). Ho provato a fare questo passo di preparazione IN getData, ma senza fortuna.
Tuttavia, fornisce un modello che rimuove la piastra di controllo "promettete da scartare" del controller e potrebbe essere utile nei casi in cui si desidera utilizzare determinati dati ottenuti da $ http in più di un posto mantenendolo ASCIUTTO.
then?