Мне действительно не нравится тот факт, что из-за «обещанного» способа работы потребитель службы, использующий $ http, должен «знать», как распаковать ответ.
Я просто хочу позвонить и вывести данные, как в старом $scope.items = Data.getData();
стиле, который сейчас не рекомендуется .
Я пытался некоторое время и не нашел идеального решения, но вот мой лучший шанс ( Плункер ). Это может быть полезно для кого-то.
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;
});
Затем контроллер:
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
};
});
Я могу уже заметить недостатки
- Вы должны передать объект, к которому вы хотите добавить данные , что не является интуитивным или распространенным шаблоном в Angular.
getData
может принимать obj
параметр только в форме объекта (хотя он также может принимать массив), что не будет проблемой для многих приложений, но является серьезным ограничением
- Вы должны подготовить объект ввода
$scope.data
с , = {}
чтобы сделать его объектом ( по существу , что $scope.clearData()
делает выше), или = []
для массива, или он не будет работать (мы уже имея предположить , что - то о том , что грядет данные). Я пытался сделать этот шаг подготовки IN getData
, но не повезло.
Тем не менее, он предоставляет шаблон, который удаляет шаблон контроллера "обещание разворачивания" и может быть полезен в тех случаях, когда вы хотите использовать определенные данные, полученные из $ http, в более чем одном месте, сохраняя их СУХОЙ.
then
?