2015-06-11 9 views
5

मैं एक ढांचे के रूप AngularJS का उपयोग कर एक मोबाइल एप्लिकेशन पर काम कर रहा हूँ में इसका इस्तेमाल करते हैं, वर्तमान में मैं एक संरचना इस के समान है:AngularJS ऐप: JSON एक बार से लोड डेटा और कई नियंत्रकों

app.config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
     .when('/', { 
      templateUrl : 'pages/home.html', 
      controller : 'homeCtrl' 
     }) 

     .when('/one', { 
      templateUrl : 'pages/one.html', 
      controller : 'oneCtrl' 
     }) 

     .when('/two', { 
      templateUrl : 'pages/two.html', 
      controller : 'twoCtrl' 
     }); 
}]); 

app.controller('homeCtrl', ['$scope', function($scope) { 

}]); 

app.controller('oneCtrl', ['$scope', function($scope) { 

}]); 

app.controller('twoCtrl', ['$scope', function($scope) { 

}]); 

और फिर मैं 'm एक ng-view साथ सामग्री प्रदर्शित:

<div class="ng-view></div> 

चीजें अच्छी तरह से काम कर रहे हैं, लेकिन मैं अनुप्रयोग की सभी सामग्री को भरने के लिए एक JSON फ़ाइल से डेटा लोड करने की जरूरत है। मैं क्या चाहता हूं और एक AJAX कॉल केवल एक बार और फिर मेरे सभी अलग-अलग नियंत्रकों के माध्यम से डेटा पास करें। मेरे पहले प्रयास में, मैंने इसके अंदर $http.get() के साथ एक सेवा बनाने का विचार किया और इसमें शामिल है कि प्रत्येक नियंत्रक में, लेकिन यह काम नहीं करता है क्योंकि जब भी मैं इंजेक्ट करता हूं और सेवा का उपयोग करता हूं तो यह एक अलग AJAX अनुरोध करता है। चूंकि मैं कोणीय का उपयोग कर नया हूं, मैं सोच रहा हूं कि इसे गड़बड़ किए बिना इसे प्राप्त करने का सबसे अच्छा तरीका या अधिक "कोणीय तरीका" क्या है।

संपादित करें: मैं सेवा है, जो सिर्फ एक सरल $http.get अनुरोध है की कोड जोड़ रहा:

app.service('Data', ['$http', function($http) { 
    this.get = function() { 
     $http.get('data.json') 
     .success(function(result) { 
      return result; 
     }) 
    } 
}); 
+2

आपकी सेवा उदाहरण से लापता है:

(function (app) { 'use strict'; app.factory('myService', MyService); MyService.$inject = ['$q', '$http']; function MyService($q, $http) { var data; var service = { getData: getData }; return service; ////////////////////////////////////// function getData(refresh) { if (refresh || !data) { return $http.get('your_source').then(function(data){ this.data = data; return data; }) } else { var deferrer = $q.defer(); deferrer.resolve(data); return deferrer.promise; } } } }(angular.module('app'))); 

अब आप अपने नियंत्रक फ़ाइल और उपयोग में इस निर्भरता को जोड़ सकते हैं कोड, जो यहां देखने के लिए सबसे उपयोगी बात होगी। – seanhodges

+0

@Didier मैं आपको कोड फ़ाइलों को विभिन्न नियंत्रकों में विभाजित करने का सुझाव दूंगा, और इस डेटा लाने के लिए एक सेवा का उपयोग करूंगा। सेवा कोड –

उत्तर

4

यह एक प्राप्त लिंक से JSON डेटा प्राप्त करने के लिए प्रयास करें:

myService.getData().then(function(data){ 
    //use data here 
}, function(err){ 
    //Handle error here 
}); 
+0

यह एक आकर्षण की तरह काम करता है, मैं इस समस्या को कई तरीकों से हल करने के लिए तैयार हूं लेकिन एक सिंगलटन पैटर्न का उपयोग करके कभी भी मेरे दिमाग को पार नहीं किया। धन्यवाद! – Didier

+0

मुझे 'this.data = data; 'पंक्ति के लिए' यह अपरिभाषित 'हो रहा है, और यदि मैं इसे हटा देता हूं तो GET अनुरोध कई बार होता है। कोई उपाय? – bjesus

+0

एक नए वादे को शुरू करने की आवश्यकता नहीं है क्योंकि $ http एक वादा देता है, आप इसके बजाय वादे का संदर्भ वापस कर सकते हैं, जवाब सही है लेकिन यह अधिक संक्षिप्त हो सकता है –

7

एक बार वादा प्रारंभ, और यह करने के लिए एक संदर्भ वापसी:

नहीं एक और वादा शुरू करने की जरूरत है। $ http एक रिटर्न देता है।

बस परिणाम को संशोधित करने के

angular.module('app', []) 
    .service('service', function($http){ 
    this.promise = null; 
    function makeRequest() { 
     return $http.get('http://jsonplaceholder.typicode.com/posts/1') 
      .then(function(resp){ 
        return resp.data; 
      }); 
    } 
    this.getPromise = function(update){ 
     if (update || !this.promise) { 
     this.promise = makeRequest(); 
     } 
     return this.promise;  
    } 
    }) 

Codepen example

संपादित अपने वादे पर एक .then() कॉल हमले: आप के बजाय $ http कैश उपयोग करने पर विचार कर सकते हैं। यह एक ही परिणाम प्राप्त कर सकते हैं। From the docs:

अनेक एक अनुरोध एक ही कैश है, जो अब तक तैयार नहीं है का उपयोग किया जाता है, तो एक अनुरोध सर्वर को किया जाएगा और शेष अनुरोधों एक ही प्रतिक्रिया वापस आ जाएगी।

+0

के लिए मेरा उत्तर देखें, यदि आपको प्रतिक्रिया प्राप्त करने के द्वारा लौटाए गए डेटा को संशोधित/इलाज करने की आवश्यकता नहीं है, तो यह ठीक काम करता है क्योंकि यह डेटा के बजाय स्वयं वादा वापस कर देता है, दुर्भाग्य से यह मेरा मामला नहीं था। जवाब के लिए धन्यवाद। – Didier

+0

उदाहरण को ऐसा करने के लिए बढ़ाया जा सकता है :) –

+0

हां इसे बढ़ाया जा सकता है, वास्तव में यह एक बहुत अच्छा जवाब है, क्योंकि मैंने इसे "स्वीकार्य उत्तर" के रूप में नहीं चुना है क्योंकि हौ-ए-का जवाब पहले से ही है इस तथ्य को माना जाता है कि डेटा का इलाज किया जा सकता है। बहुत बहुत धन्यवाद। – Didier

संबंधित मुद्दे