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
getData
può accettare il obj
parametro 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.data
con = {}
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
?