Saya benar-benar tidak menyukai kenyataan bahwa, karena cara "janji" dalam melakukan sesuatu, konsumen layanan yang menggunakan $ http harus "tahu" tentang cara membongkar tanggapan.
Saya hanya ingin memanggil sesuatu dan mengeluarkan data, mirip dengan $scope.items = Data.getData();
cara lama , yang sekarang sudah usang .
Saya mencoba untuk sementara waktu dan tidak menghasilkan solusi yang sempurna, tapi inilah foto terbaik saya ( Plunker ). Mungkin bermanfaat bagi seseorang.
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;
});
Kemudian 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
};
});
Kekurangan yang sudah bisa saya temukan
- Anda harus meneruskan objek yang Anda inginkan data ditambahkan , yang bukan pola intuitif atau umum di Angular
getData
hanya dapat menerima obj
parameter dalam bentuk objek (walaupun itu juga bisa menerima array), yang tidak akan menjadi masalah bagi banyak aplikasi, tetapi ini adalah batasan yang sangat
- Anda harus menyiapkan objek input
$scope.data
dengan = {}
menjadikannya objek (pada dasarnya apa yang $scope.clearData()
dilakukan di atas), atau = []
untuk array, atau tidak akan berfungsi (kami sudah harus mengasumsikan sesuatu tentang data apa yang akan datang). Saya mencoba melakukan langkah persiapan ini getData
, tetapi tidak berhasil.
Namun demikian, ia menyediakan pola yang menghilangkan pelat boiler "janji dibuka", dan mungkin berguna dalam kasus ketika Anda ingin menggunakan data tertentu yang diperoleh dari $ http di lebih dari satu tempat sambil menjaganya tetap KERING.
then
?