2013-07-05 13 views
7

के साथ बड़े डेटासेट लोड हो रहा है मैं पेजिंग में बिना किसी पृष्ठ में बड़ी मात्रा में डेटा (1000 पंक्तियों के ऊपर) लोड करने का तरीका तैयार करने का प्रयास कर रहा हूं।AngularJS

: इस में पहली बाधा समानांतर काटने आकार विखंडू, जो मुझे लगता है मैं फिर भी क्या क्रियान्वित किया है साथ How to make sequentially Rest webservices calls with AngularJS?

पर समाधान की मदद से किया गया है दो समस्याओं में मैं चल रहा हूँ में डीबी क्वेरी करने के लिए था

  1. प्रत्येक लौटाया गया ऑब्जेक्ट एक सरणी में पारित किया जा रहा है जिसे तब स्वयं को उस सरणी के रूप में वापस कर दिया जाता है जो कोणीय बांधने के लिए उपयोग करता है। यानी [[{कुंजी: मान, कुंजी: मान, कुंजी: मान}, {कुंजी: मान, कुंजी: मान, कुंजी: मान}], [{कुंजी: मान, कुंजी: मान, कुंजी: मान}, {कुंजी: मान, कुंजी: मान, कुंजी: मान}]] जैसे कि मैं ng-repeat = "डेटा में आइटम" का उपयोग नहीं कर सकता क्योंकि डेटा सरणी की सरणी है। "डेटा में आइटम [0]" करना आइटम को उपलब्ध कराता है। Concatenation जवाब लगता है, लेकिन मैं इस तरह से काम करने में सक्षम नहीं है कि यह काम करता है।

  2. मैं डेटाबेस में एकाधिक अनुरोध कर रहा हूं और प्रत्येक अनुरोध सही तरीके से वापस आ जाता है लेकिन पृष्ठ सभी अनुरोधों को पूरा नहीं होने तक प्रस्तुत नहीं करता है - जो पहले स्थान पर एकाधिक अनुरोध करने के बिंदु को पूरी तरह से अस्वीकार करता है।

तो मेरा कोड देखकर, मैं इन दो मुद्दों को हल करने के लिए इसे फिर से लिख सकता हूं? ताकि डेटा एक सरणी के रूप में वापस कर दिया गया हो और जब भी कोई प्रश्न पूरा हो जाए तो वह डेटा प्रस्तुत किया जाता है?

app.factory('ScanService', function($http, $q) { 
    function fetchOne(stepCount) { 
    return $http({ 
     method: 'GET', 
     url: '/index.php/scans', 
     params: {step:stepCount} 
    }) 
    .then(function onSuccess(response) { 
     return response.data; 
    } 
    return { 
     fetchAll: function(steps) { 
     var scans = []; 
     for (var i = 1; i <= steps; i++) { 
      scans.push(fetchOne(i)); 
     } 
     return $q.all(scans); 
     } 
    }; 
}); 

app.controller.ScanCtrl = function($scope, $q, ScanService) { 
    $scope.scans = ScanService.fetchAll(10); 
}; 

का पालन करें अप

मैं जोड़ने चाहिए कि मैं क्या जादू कर दिया करने के लिए मिल इस नीचे समाधान और एक angular.forEach के आधार पर काम कर रहे()। "बड़े डेटा" के साथ काम करने वाले किसी भी व्यक्ति को इस मार्ग पर जाने का सुझाव नहीं दे सकता। लगभग 1000 पंक्तियों में, ब्राउज़र बहुत अभिभूत था और काफी धीमा करना शुरू कर दिया। Angular.filter के साथ फ़िल्टर करने का प्रयास करने तक भी एक महत्वपूर्ण देरी का अनुभव हुआ जब तक कि परिणाम कम नहीं हो गए। दूसरी ओर, कुछ सौ पंक्तियों ने सम्मानपूर्वक अच्छी तरह से काम किया और देशी फ़िल्टरिंग की अनुमति दी - जो मेरे कार्यान्वयन के लिए एक महत्वपूर्ण लक्ष्य था।

+3

कौन सा साईं दिमाग डेटा के हजारों पंक्तियों पर दिखना चाहता है? – Bart

+0

@ बार्ट दुख की बात है कि मुझे यह भी करना है। कुछ व्यवसाय विश्लेषकों Excel डेटा के 1000 पंक्तियों के साथ काम कर रहे हैं और वेब पर एक समान दृश्य चाहते हैं। जबकि मैं पूरी तरह से उनसे असहमत हूं, कभी-कभी आपको क्लाइंट की इच्छा होती है :( – Terry

+0

@ बार्ट जो 10 पंक्तियों के 100 पृष्ठों के माध्यम से क्लिक करना चाहता है? मुझे लगता है कि यह वास्तव में पेजिंग प्रतिमान और अनंत स्क्रॉलिंग के वैकल्पिक समाधान की तलाश में है मैं जिस समस्या का सामना कर रहा हूं उसे हल नहीं करता है। समग्र उद्देश्य यह है कि आप अपना डेटा लोड करते हैं और फिर इसे कोणीय के भीतर फ़िल्टर करते हैं, इसलिए आप जरूरी नहीं कि 1000 पंक्तियां देखें - लेकिन अगर आप पागल हो तो आप कर सकते हैं। – iamsar

उत्तर

6

यदि आप प्रत्येक व्यक्ति को अलग-अलग व्यवहार करना चाहते हैं (प्रत्येक व्यक्ति को व्यक्तिगत रूप से प्रदर्शित करना चाहते हैं) तो आप वास्तव में $ q.all वादे को पूरा नहीं कर सकते हैं (जो उन्हें एक बड़े वादे में सफल बनाता है या विफल रहता है)।

मैं उन चीजों को धक्का दूंगा जैसे आप उन्हें प्राप्त करते हैं। नीचे एक उदाहरण है: http://jsfiddle.net/wWcvx/1/

एक मुद्दा यहाँ है जहां मदों की क्रम जब वे लौट रहे थे पर आधारित हैं, अपने मूल अनुरोध आदेश पर नहीं है:

function MyCtrl($scope, $timeout, $q) { 
     var fetchOne = function() { 
      var deferred = $q.defer(); 
      $timeout(function() { 
       deferred.resolve([random(), random() + 100, random() + 200]); 
      }, random() * 5000); 
      return deferred.promise; 
     }; 

     $scope.scans = []; 
     for (var i = 0; i < 2; i++) { 
      fetchOne().then(function(items) { 
       angular.forEach(items, function(item) { 
        $scope.scans.push(item); 
       }); 
      }); 
     }; 
    } 

यहाँ कार्रवाई में यह दिखा एक बेला है। मैं आपको खुद को बाहर निकालने दूँगा।

+0

प्रतिक्रिया के लिए धन्यवाद। यह जांचने के लिए कार्यालय में वापस आने से कुछ सप्ताह पहले होगा लेकिन मैं इसे उपयोग करने के लिए उत्सुक हूं। आदेश वास्तव में वैसे भी कोई फर्क नहीं पड़ता है। – iamsar

+2

अंततः यह एक और रूप देने के लिए चारों ओर मिल गया। खूबसूरती से काम किया। शुरू में मैंने इसे करने की कोशिश की तुलना में बहुत आसान है। वह 'angular.forEach' फ़ंक्शन कुंजी था। – iamsar