জিনিসগুলি করার "প্রতিশ্রুতি" পদ্ধতির কারণে, service 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 HTTP থেকে প্রাপ্ত নির্দিষ্ট ডেটা একাধিক স্থানে DRY রাখার জন্য ব্যবহার করতে চান তখন ক্ষেত্রে এটি কার্যকর হতে পারে।
then
?