Realmente no me gusta el hecho de que, debido a la forma "prometedora" de hacer las cosas, el consumidor del servicio que usa $ http tiene que "saber" cómo desempaquetar la respuesta.
Solo quiero llamar a algo y obtener los datos, similar a la $scope.items = Data.getData();
forma anterior, que ahora está en desuso .
Lo intenté por un tiempo y no encontré una solución perfecta, pero aquí está mi mejor oportunidad ( Plunker ). Puede ser útil para alguien.
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;
});
Entonces 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
};
});
Las fallas que ya puedo detectar son
- Debe pasar el objeto al que desea agregar los datos , que no es un patrón intuitivo o común en Angular
getData
solo puede aceptar el obj
parámetro en forma de un objeto (aunque también podría aceptar una matriz), lo que no será un problema para muchas aplicaciones, pero es una limitación importante
- Tienes que preparar el objeto de entrada
$scope.data
con = {}
para que sea un objeto (en esencia, lo que $scope.clearData()
lo hace más arriba), o = []
de una matriz, o de lo contrario no funciona (ya estamos tener que asumir algo acerca de lo que está llegando datos). Traté de hacer este paso de preparación getData
, pero no tuve suerte.
Sin embargo, proporciona un patrón que elimina la repetitiva "promesa de desenvolver" del controlador, y podría ser útil en los casos en que desee utilizar ciertos datos obtenidos de $ http en más de un lugar mientras lo mantiene SECO.
then
?