मैं वास्तव में इस तथ्य को पसंद नहीं करता कि, चीजों को करने के "वादे" तरीके के कारण, प्रतिक्रिया को अनपैक करने के तरीके के बारे में $ 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
};
});
पंजे मैं पहले से ही हाजिर हैं
- आपको उस ऑब्जेक्ट में पास करना होगा जो आप चाहते हैं कि डेटा जोड़ा जाए , जो कि कोणीय में एक सहज या सामान्य पैटर्न नहीं है
getData
केवल obj
ऑब्जेक्ट के रूप में पैरामीटर को स्वीकार कर सकते हैं (हालांकि यह एक सरणी को भी स्वीकार कर सकता है), जो कई अनुप्रयोगों के लिए समस्या नहीं होगी, लेकिन यह एक गंभीर सीमा है
- आप इनपुट वस्तु तैयार करना है
$scope.data
के साथ = {}
यह एक वस्तु बनाने के लिए (अनिवार्य रूप से क्या $scope.clearData()
ऊपर करता है), या = []
एक सरणी के लिए है, या यह काम नहीं (हम पहले से ही क्या डेटा आ रहा है के बारे में कुछ ग्रहण करने के लिए आ रही हैं,) होगा। मैंने इस तैयारी को IN में करने की कोशिश की getData
, लेकिन कोई किस्मत नहीं।
फिर भी, यह एक पैटर्न प्रदान करता है जो नियंत्रक "वादा अनट्रैप" बॉयलरप्लेट को हटा देता है, और ऐसे मामलों में उपयोगी हो सकता है जब आप $ DR से प्राप्त कुछ डेटा का उपयोग DRY रखते हुए एक से अधिक स्थानों पर करना चाहते हैं।
then
?