2012-08-03 25 views
39

जोड़ा मिलती है:Firebase child_added इकलौती संतान Firebase एपीआई से

बाल जोड़े: इस घटना को इस स्थान पर प्रत्येक प्रारंभिक बच्चे के लिए एक बार ट्रिगर किया जाएगा, और इसे फिर हर बार ट्रिगर किया जाएगा एक नया बच्चे जोड़ दिया गया है।

कुछ कोड:

listRef.on('child_added', function(childSnapshot, prevChildName) { 
    // do something with the child 
}); 

लेकिन समारोह के बाद से इस स्थान पर प्रत्येक बच्चे के लिए एक बार कहा जाता है, वहाँ किसी भी तरह से एकमात्र संतान है कि वास्तव में जोड़ा गया था प्राप्त करने के लिए है?

+10

यह विधि ऐसा क्यों नहीं करती है जो यह कहती है कि यह करने वाला है? यह केवल एक चीज करना चाहिए - जब भी कोई बच्चा जोड़ा जाता है तो ट्रिगर करें - और कुछ नहीं। –

+2

हाँ सहमत हैं @ जोस ब्राउन। भ्रमित ... –

उत्तर

29

पिछले रिकॉर्ड प्राप्त करने में कठिनाई के बिना कुछ चौकी के बाद से जोड़ा बातों पर नज़र रखने के लिए, आपको endAt() और limit() उपयोग कर सकते हैं पिछले रिकॉर्ड हड़पने के लिए:

// retrieve the last record from `ref` 
ref.endAt().limit(1).on('child_added', function(snapshot) { 

    // all records after the last continue to invoke this function 
    console.log(snapshot.name(), snapshot.val()); 

}); 
+0

दरअसल, मैंने एक आसान दृष्टिकोण खोजा, क्योंकि यह सीमा() तक पहुंचने के बाद भी आपको अतिरिक्त घटनाओं के बारे में सूचित करता रहा है। मैंने तदनुसार अपना जवाब अपडेट कर लिया है। – Kato

+1

यह स्पष्ट नहीं है कि आपका क्या मतलब है। यह केवल ऑर्डर किए गए सेट पर ही काम करता है, लेकिन अगर आपको किसी और चीज के लिए ऑर्डर करने की आवश्यकता है (ऑर्डर किए गए सेट के अलावा?) ... इसके अलावा, आपकी टिप्पणी किसी को भी समझने में मदद नहीं करती है कि फायरबेस में बच्चे को कैसे जोड़ा जाए। – Kato

+1

कॉलबैक फ़ंक्शन केवल 'ref.endAt() सीमा (1) 'द्वारा रिकॉर्ड किए गए रिकॉर्ड के लिए आग लग जाता है। यह रिकॉर्ड के बाद जोड़े गए अन्य नए रिकॉर्ड के लिए आग नहीं है। मैं Angularfire 0.8 के साथ इसका परीक्षण कर रहा हूँ।0 – Waseem

28

limit() विधि मान्य नहीं है। limitToLast() और limitToFirst() विधियों को प्रतिस्थापित करें। जो तय यह वास्तव में नया है से पहले मान्य या एक पुराने रिकॉर्ड तो था जा करने के लिए मैं एक अलग करने के लिए "स्थिति" सेट की जरूरत है उदाहरण के लिए "स्थिति" -

// retrieve the last record from `ref` 
ref.limitToLast(1).on('child_added', function(snapshot) { 

    // all records after the last continue to invoke this function 
    console.log(snapshot.name(), snapshot.val()); 
    // get the last inserted key 
    console.log(snapshot.key()); 

}); 
+3

में चेक सुनिश्चित करने के लिए डेट प्रॉपर्टी का उपयोग कर रहा हूं, मैंने इस दृष्टिकोण को आजमाया है, लेकिन एक बात यह देखने के लिए है कि: यदि अंतिम रिकॉर्ड हटा दिया गया है, उदाहरण के लिए कोई उपयोगकर्ता कोई टिप्पणी पोस्ट करता है और इसे सही करता है दूर (उदाहरण के लिए यह एक गलती थी) उपरोक्त .on() फ़ंक्शन को फिर से बुलाया जाएगा। मैंने एक टाइमस्टैम्प जोड़ने और यह जांचने का हल किया कि क्या जोड़ा गया बच्चा एक सेकंड से भी कम पुराना है, अगर यह पुराना है, तो यह पुराना रिकॉर्ड है और इसे जोड़ा नहीं गया था। इसके लिए ref.child ('। Info') – DivZero

+2

पर एक नज़र डालें, मुझे यह नहीं मिला - क्या यह अंतिम आइटम नहीं मिलेगा? "इस घटना को बाध्य करने के बाद केवल आइटम जोड़े गए" के बारे में क्या? –

+0

हां यह सोच रहा है। यह सिर्फ एक बार आखिरी वस्तु प्राप्त करता है और फिर अन्य जोड़े गए कार्यक्रमों के लिए आग नहीं लगाता है। – Orlando

0

मेरे लिए तर्क था मूल्य है

@Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String previousChildKey) { 

       if(dataSnapshot.hasChildren()) { 

        String Id = (String) dataSnapshot.child("user_id").getValue(); 
        String status = (String) dataSnapshot.child("status").getValue(); 

        if (Id != null && Id.equals(storedId) && status != null && status.equals("created")) { 
         Log.d("INCOMING_REQUEST", "This is for you!"); 
         sessionsRef.child(dataSnapshot.getKey()).child("status").setValue("received"); 
        } 

       } 


     } 
0

Swift3 समाधान:: मूल्य तो मैं इसे अगली बार नहीं मिलता

आप नीचे दिए गए कोड के माध्यम से अपने पिछले डेटा पुनः प्राप्त कर सकते हैं:

queryRef?.observeSingleEvent(of: .value, with: { (snapshot) in 
     //Your code 

    }) 

और उसके बाद निम्न कोड के माध्यम से नया डेटा देखें।

queryRef?.queryLimited(toLast: 1).observe(.childAdded, with: { (snapshot) in 

//Your Code 

     }) 
1

मैंने अन्य उत्तरों के तरीके की कोशिश की लेकिन अंतिम बच्चे के लिए कम से कम एक बार आह्वान किया। यदि आपके डेटा में समय कुंजी है, तो आप इस तरह से कर सकते हैं।

ref.orderByChild('createdAt').startAt(Date.now()).on('child_added', ... 
1

ref.push() विधि बुला के बिना डेटा समय के आधार पर पथ कुंजी उत्पन्न करता है के बाद से, यह मैं क्या किया है:

// Get your base reference 
const messagesRef = firebase.database().ref().child("messages"); 

// Get a firebase generated key, based on current time 
const startKey = messagesRef.push().key; 

// 'startAt' this key, equivalent to 'start from the present second' 
messagesRef.orderByKey().startAt(startKey) 
.on("child_added", 
    (snapshot)=>{ /*Do something with future children*/} 
); 

ध्यान दें कि कुछ भी नहीं है वास्तव में ('कुंजी' या) संदर्भ के लिए लिखा है कि ref.push() लौटा, इसलिए खाली डेटा पकड़ने की कोई आवश्यकता नहीं है।

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