Мені дуже не подобається той факт, що через "обіцяний" спосіб виконання дій споживач послуги, яка використовує $ http, повинен "знати" про те, як розпакувати відповідь.
Я просто хочу щось зателефонувати та отримати дані, схожі на старий $scope.items = Data.getData();
спосіб, який зараз застарілий .
Я деякий час намагався і не придумав ідеального рішення, але ось мій найкращий знімок ( Plunker ). Можливо, комусь це стане в нагоді.
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
?