Ich mag die Tatsache wirklich nicht, dass der Verbraucher des Dienstes, der $ http verwendet, aufgrund der "vielversprechenden" Vorgehensweise "wissen" muss, wie die Antwort entpackt werden soll.
Ich möchte nur etwas anrufen und die Daten herausholen, ähnlich wie bei der alten $scope.items = Data.getData();
Methode, die jetzt veraltet ist .
Ich habe es eine Weile versucht und keine perfekte Lösung gefunden, aber hier ist mein bester Schuss ( Plunker ). Es kann für jemanden nützlich sein.
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;
});
Dann 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
};
});
Mängel, die ich bereits erkennen kann, sind
- Sie müssen das Objekt übergeben, zu dem die Daten hinzugefügt werden sollen. Dies ist in Angular kein intuitives oder allgemeines Muster
getData
kann den obj
Parameter nur in Form eines Objekts akzeptieren (obwohl er auch ein Array akzeptieren könnte), was für viele Anwendungen kein Problem darstellt, aber eine schmerzhafte Einschränkung darstellt
- Sie haben die Eingabeobjekt vorzubereiten
$scope.data
mit = {}
ihm ein Objekt ( im Wesentlichen , was zu machen $scope.clearData()
oben der Fall ist), oder = []
für ein Array, oder es wird nicht funktionieren (wir haben schon etwas zu übernehmen , welche Daten kommt). Ich habe versucht, diesen Vorbereitungsschritt IN durchzuführen getData
, aber kein Glück.
Nichtsdestotrotz bietet es ein Muster, das das Controller-Boilerplate "Versprechen auspacken" entfernt und in Fällen nützlich sein kann, in denen Sie bestimmte Daten aus $ http an mehr als einer Stelle verwenden möchten, während Sie es trocken halten.
then
?