2016-12-25 6 views
10

कोड:मेरी फ़ायरबेस अनंत स्क्रॉल में क्रमिक रूप से डेटा को व्यवस्थित कैसे करें?

<script> 

    var app = angular.module('app', ['firebase']); 

    app.controller('ctrl', function ($scope, $firebaseArray, $timeout) { 


      console.log(<%=lastID%>); 

      $scope.data = []; 
      var _n = Math.ceil(($(window).height() - 50)/(350)) + 1; 
      var _start = <%= lastID %>; 
      var _end = <%= lastID %> + _n - 1; 

      $scope.getDataset = function() { 

       fb.orderByChild('id').startAt(_start).endAt(_end).limitToLast(_n).on("child_added", function(dataSnapshot) { 

        $scope.data.push(dataSnapshot.val()); 
        $scope.$apply() 
        console.log("THE VALUE:"+$scope.data); 

       }); 

       _start = _start + _n; 
       _end = _end + _n; 

      }; 


      $scope.getDataset(); 

      window.addEventListener('scroll', function() { 
       if (window.scrollY === document.body.scrollHeight - window.innerHeight) { 
         $scope.$apply($scope.getDataset()); 
       } 
      }); 

    }); 

    // Compile the whole <body> with the angular module named "app" 
    angular.bootstrap(document.body, ['app']); 


</script> 

स्थिति:

lastID बनाया पिछले पोस्ट की आईडी है। वे पीछे की तरफ जाते हैं (-1 से अंतिम तक)।

यह समाधान पूरी तरह से काम करता है जब कुछ पोस्ट हटा दिए जाते हैं।

(पोस्ट नवीनतम से सबसे पुराने (अंतिम आईडी से -1 तक) का आदेश दिया जाता है)।

उदाहरण के लिए, यदि 16 पद हैं, lastID = -16।

यदि मैं पद -13 से -5 और पोस्ट -3 हटा देता हूं, तो अंतिम आईडी -16 पर रहता है।

जिसका अर्थ है कि जब पृष्ठ लोड होता है, तो 3 पहली पोस्ट (-16 से -14) लोड होने के बाद कोई पोस्ट दिखाई नहीं देती है और मुझे पोस्ट -4 दिखाई देने के लिए बार-बार स्क्रॉल करने की आवश्यकता होती है।


प्रश्न:

कैसे मुझे यकीन है कि अगर कुछ पोस्ट हटा दी जाती हैं, मेरे अनंत स्क्रॉल स्क्रिप्ट inexisting पदों की आईडी को छोड़ देगा और सिर्फ 3 निकटतम पोस्ट लोड कर सकते हैं?


मैं क्या जांच की गई:

मैं इस पर ध्यान:

Display posts in descending posted order

लेकिन मैं मैं अपने अनंत स्क्रॉल के अंदर उन समाधानों कैसे लागू होता है के रूप में यकीन नहीं है। कोई विचार ?

उत्तर

2

यदि मैं आपको सही ढंग से समझता हूं, तो आपको अंत का उपयोग करने की आवश्यकता नहीं है। यह startAt + सीमित कर

fb.orderByChild('id').startAt(_start).limit(n)... 

और उतरते आइटम ऑर्डर करने के लिए एक लेआउट का उपयोग का प्रयोग कर प्राप्त किया जा सकता है। इस का उपयोग करके आप अगर वे लगातार

अद्यतन

आप ऐसा कर सकते हैं और भी आसान कर रहे हैं आईडी के अनुक्रम के बारे में चिंता करने की जरूरत नहीं है। बस इस मामले में अपने _start हमेशा का आयोजन करेगा पिछले आईडी एक नवीनतम मूल्य

fb.orderByChild('id').startAt(_start).limit(_n).on("child_added", function(dataSnapshot) { 

    $scope.data.push(dataSnapshot.val()); 
    $scope.$apply() 
    _start = dataSnapshot.child('id').val() 
    console.log("THE VALUE:"+$scope.data); 

}); 

साथ अपने प्रारंभ अपडेट करेंगे और आपको नष्ट कर दिया तत्वों के बारे में चिंता नहीं कर सकते। वैकल्पिक रूप से आप पिछले आईडी मान Firebase में सहेजी गई सभी डाटा स्टोर और startAt

+0

आपकी तर्क ध्वनि है और तीन आइटम लोड हो जाते हैं यदि उदाहरण के लिए मैं -1 से -6 की सूची में -2, -3 और -5 हटा देता हूं। समस्या यह है: चूंकि हमने endAt() को हटा दिया है, इसलिए मैं दूसरी बार स्क्रॉल कर सकता हूं और -2 और -3 फिर से लोड हो जाते हैं। वास्तव में, डेटा के पहले सेट के लिए lastID = -6, लेकिन अंतिम स्क्रॉल के लिए lastID = -3 और दूसरी स्क्रॉल के लिए अंतिम आईडी = 0। – Coder1000

+0

मैं पिछले आइटम भरी हुई और उस को _start सेट की आईडी प्राप्त करने की आवश्यकता होगी। लेकिन मैं अपने फायरबेस ऑर्डर फ़ंक्शन के अंदर अंतिम आइटम कैसे चुन सकता हूं? – Coder1000

+0

@ कोडर 1000 कृपया मेरे अपडेट किए गए उत्तर को देखें –

1

असल में इसका इस्तेमाल करने के लिए एक अस्थायी चर का उपयोग कर सकते के बाद से प्रत्येक रिकॉर्ड के लिए स्वत: जनरेट आईडी टाइमस्टैम्प पर आधारित है, कालक्रम के अनुसार आदेश दिया है। इसलिए आपको अपने मूल्यों को ऑर्डर करने की आवश्यकता नहीं है।बस सुनिश्चित करें कि आप फ़ायरबेस में सहेजे जा रहे प्रमुख मूल्य जोड़ी में एक नई आईडी जोड़ रहे हैं।

मामले में आप (बनाने सबसे हाल ही में रिकॉर्ड शीर्ष पर दिखाई देते हैं), तो आप इसे पढ़ने के बाद सूची को उल्टा करने की आवश्यकता होगी सूची का क्रम उलटने करना चाहते हैं।

संपादित

आप डेटाबेस में अपने रिकॉर्ड की स्थिति प्राप्त करना चाहते हैं, तो आप निम्न जैसा कुछ का उपयोग कर सकते हैं:

var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs"); 
ref.orderByKey().on("child_added", function(snapshot) { 
    console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall"); 
}); 

आप here आदेश देने के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

+0

मैं आपकी तर्क समझता हूं और मैंने इसके बारे में सोचा था, लेकिन इस समाधान का उपयोग करने वाले उत्तर एक मैं वर्तमान में उपयोग कर रहा हूँ की तुलना में अधिक कोड का उपयोग करें। मैं डेटाबेस में मेरी पोस्ट के अंदर अतिरिक्त आईडी स्टोर करने के लिए नहीं होने को छोड़कर एक लाभ के ज्यादा नहीं दिख रहा। या वहां इस दृष्टिकोण के बारे में मैं नहीं जानता कि कुछ महत्वपूर्ण लाभ है? – Coder1000

+0

वह तथ्य है कि आपको आईडी को स्टोर करने की आवश्यकता नहीं है क्योंकि ये स्वचालित रूप से जेनरेट किए गए हैं पहले से ही एक प्लस है। रिकॉर्ड करने के दौरान आपको केवल कोड की निम्न पंक्ति जोड़नी है: 'var newPostRef = postsRef.push(); 'यह स्वचालित रूप से एक आईडी आधार एक पल में अपने टाइमस्टैम्प उत्पन्न होगा। –

+0

मैं जानता हूँ कि ^^। लेकिन जो वास्तव में केवल लाभ इस समाधान के लिए है? – Coder1000

1

startAt और limitToFirst अगले पदों को पुन: प्राप्त करने के लिए इस्तेमाल किया जा सकता है।

बस अंतिम लोड की गई पोस्ट (start + 1) के id के बाद फ़ायरबेस को शुरू करने के लिए बताएं, और id हटा दिया जाएगा स्वचालित रूप से छोड़ा जाएगा।

var itemsPerScroll = 1; 
$scope.getDataset = function() { 
    var start = $scope.data.slice(-1)[0].id 
    fb.orderByChild('id').startAt(start + 1).limitToFirst(itemsPerScroll) 
    .on("child_added", function(dataSnapshot) { 
    $scope.data.push(dataSnapshot.val()); 
    $scope.$apply() 
    }) 
} 
+0

इस जवाब के साथ समस्या यह है कि firebase में आईडी वृद्धिशील नहीं हैं ... – m1crdy

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