Gerçekten, "söz" şeyler yapma yolu nedeniyle, $ http kullanan hizmetin tüketici yanıtı açmak için nasıl "bilmek" olması gerçeğini sevmiyorum.
Sadece bir şey aramak ve eski benzer verileri, almak istiyorum $scope.items = Data.getData();
şeklinden, şimdi artık yok .
Bir süre denedim ve mükemmel bir çözüm bulamadım, ama işte en iyi atışım ( Plunker ). Birisi için yararlı olabilir.
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;
});
Sonra denetleyici:
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
};
});
Zaten tespit edebileceğim kusurlar
- Açısal'da sezgisel veya ortak bir desen olmayan verilerin eklenmesini istediğiniz nesneyi iletmeniz gerekir
getData
obj
parametreyi yalnızca bir nesne biçiminde kabul edebilir (bir dizi de kabul edebilse de), bu birçok uygulama için sorun oluşturmaz, ancak bu bir boğaz sınırlamasıdır
- Sen girdi nesnesi hazırlamak zorunda
$scope.data
olan = {}
bir nesne yapmak için (aslında neyi $scope.clearData()
yukarıdaki yapar) veya = []
bir dizi için, ya da değil çalışma (biz zaten veri geliyor ne hakkında bir şeyler varsaymak yaşıyorsanız) olacaktır. Bu hazırlık adım IN yapmaya çalıştım getData
, ama şans yok.
Bununla birlikte, kontrolör "vaat paketini aç" kazan plakasını kaldıran bir desen sağlar ve DRY'yi tutarken $ http'den elde edilen belirli verileri birden fazla yerde kullanmak istediğiniz durumlarda yararlı olabilir.
then
?