2014-04-20 13 views
6

मैं इंटरनेट पर एक समाधान अंतराल समय पर अपने $ http जेसन अनुरोध को अपडेट करने में सक्षम होने के लिए प्रयास कर रहा हूं और साथ ही साथ यह मेरी बाइंडिंग अपडेट कर रहा है नए डेटा के साथ।कोणीय जेएस अद्यतन अंतराल पर जेसन अपडेट करें और दृश्य को अपडेट करें

मैंने $ टाइमआउट का उपयोग करके कुछ उदाहरण देखे हैं लेकिन यह काम नहीं कर पा रहा है और सिर्फ यह जानना चाहता था कि इसके लिए सबसे अच्छा तरीका क्या होगा। नए डेटा के साथ विचारों को अपडेट करने में भी सक्षम होना कुछ ऐसा है जो मैं हल नहीं कर सकता क्योंकि मैं नया अनुरोध करने में सक्षम नहीं हूं।

मेरा वर्तमान निर्माण यहां है।

app.js फ़ाइल, यह सिर्फ जेसन के लिए प्रारंभिक fetch दिखाता है।

var myApp = angular.module('myApp', ['ngRoute']); 

    myApp.controller('MainCtrl', ['$scope', '$http', 
     function($scope, $http, $timeout) { 
      $scope.Days = {}; 

      $http({ 
       method: 'GET', 
       url: "data.json" 
      }) 
       .success(function(data, status, headers, config) { 
        $scope.Days = data; 
       }) 
       .error(function(data, status, headers, config) { 
        // something went wrong :(
       }); 

     } 
    ]); 

एचटीएमएल स्थापना:

<ul ng-controller="MainCtrl"> 
    <li class="date" ng-repeat-start="day in Days"> 
    <strong>>{{ day.Date }}</strong> 
    </li> 

    <li class="item" ng-repeat-end ng-repeat="item in day.Items"> 
    <strong>>{{ item.Name }}</strong> 
    </li> 
</ul> 
+0

मैं क्या समझ में नहीं आता आप हासिल करने की कोशिश करो। आपके उदाहरण से आप http async कॉल को कॉल करते हैं जो 'Days' ऑब्जेक्ट देता है। 'NgRepeat 'निर्देश' दिन 'परिवर्तन (निजी पर्यवेक्षक हैं) पर सुनता है और नया डेटा दिखाता है। समस्या क्या है? धन्यवाद, –

+0

जो सर्वर डेटा मैं सर्वर से अनुरोध कर रहा हूं उसे लगातार अपडेट किया जा रहा है और मैं इंप्रेशन के तहत था कि मुझे अपडेट किए गए जेसन डेटा को पकड़ने के लिए $ http को याद करने के लिए टाइमआउट फ़ंक्शन सेट करना होगा और फिर वर्तमान दृश्य अपडेट करना होगा। हो सकता है कि मैं अभी भी थोड़ा उलझन में हूं कि कैसे कोणीय काम करता है। मैं क्षमाप्रार्थी हूं। – Anks

+0

तो जैसा कि मैं समझता हूं कि आप कुछ देरी के साथ लूप http में चलाना चाहते हैं, है ना? –

उत्तर

9

मैं $timeout का प्रयोग करेंगे।

जैसा कि आप $timeout वापसी वादे को जानते हैं। तो जब वादा हल हो जाता है तो हम विधि myLoop को एक बार फिर कॉल कर सकते हैं।

निम्नलिखित उदाहरण में हम प्रत्येक 10 सेकेंड http को कॉल करते हैं।

var timer; 

function myLoop() { 
    // When the timeout is defined, it returns a 
    // promise object. 
    timer = $timeout(function() { 
     console.log("Timeout executed", Date.now()); 
    }, 10000); 

    timer.then(function() { 
     console.log("Timer resolved!"); 

     $http({ 
      method: 'GET', 
      url: "data.json" 
     }).success(function (data, status, headers, config) { 
      $scope.Days = data; 
      myLoop(); 
     }).error(function (data, status, headers, config) { 
      // something went wrong :(
     }); 
    }, function() { 
     console.log("Timer rejected!"); 
    }); 

} 

myLoop(); 

एक तरफ ध्यान दें के रूप में:

जब नियंत्रक नष्ट हो जाता है कॉल करने के लिए सुनिश्चित हो $timeout.cancel(timer);

// When the DOM element is removed from the page, 
// AngularJS will trigger the $destroy event on 
// the scope. 
// Cancel timeout 
$scope.$on("$destroy", function (event) { 
    $timeout.cancel(timer); 
}); 

डेमो Fiddle

+0

क्या $ अंतराल का उपयोग करने पर $ टाइमआउट का उपयोग करने का कोई लाभ है? – Anks

+0

@Anks हमारे मामले में मुझे लगता है कि '$ टाइमआउट' बेहतर है क्योंकि आपकी विधि एसिंक कॉल है। यह सच है कि '$ अंतराल' कम महंगा है और आप पाचन सेट कर सकते हैं ताकि पाचन चक्र को आग न पहुंचे। हालांकि हमारे मामले में हम सफलता कॉलबैक मिलने पर केवल अगली कॉल आग लगाते हैं। अगर अनुरोध विफल या अटक गया तो क्या होता है, '$ अंतराल' http कॉल पर फिर से जारी रहेगा। तो यह आपकी पसंद बेहतर है। –

+0

बीटीडब्ल्यू, यहां एक डॉस है: https://docs.angularjs.org/api/ng/service/$interval –

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