2013-02-11 13 views
5

मुझे ग्राहकों को सर्वर की ओर से बदलावों के बारे में सूचित करने की आवश्यकता है। मेरे मामले में मैं सर्वर और क्लाइंट पर विभिन्न संग्रहों का उपयोग कर रहा हूं (इस प्रश्न में इसके बारे में अधिक जानकारी: how would you build pinterest like page with meteor.js)।संग्रह से उपयोग नहीं कर रहे सभी क्लाइंट्स से सर्वर से डेटा को कैसे धक्का देना है?

सर्वर पर मुझे बाहरी API से नए उत्पाद मिल रहे हैं। मैं सभी ग्राहकों को नई वस्तुओं की संख्या प्रकाशित करना चाहता हूं कि वे अच्छी तरह से काम करने के लिए लेआउट के लिए आवश्यक स्थानीय चर अपडेट कर सकते हैं। इसे कैसे करें?

यह अच्छा होगा अगर मैं Meteor.Collection से अन्य प्रकार के डेटा प्रकाशित/सब्सक्राइब कर सकता हूं। मुझे Meteor.deps मिला, लेकिन मैं समझता हूं कि यह केवल क्लाइंट पक्ष पर ही काम करता है।

+0

यहां विस्तृत उत्तरों के साथ एक नई पोस्ट है: http://stackoverflow.com/questions/18584757/ –

उत्तर

2

जो कुछ आप चाहते हैं उसे पूरा करने के लिए आपको क्लाइंट पर एक और संग्रह की आवश्यकता है। सर्वर पर, एक प्रकाशित फ़ंक्शन में, उत्पाद की वर्तमान गिनती को एक विशेषता में असाइन करने वाले स्क्रैच से एक दस्तावेज़ बनाएं। निरीक्षण() और सेट का उपयोग करके, count संशोधित करें जब दस्तावेज़ जोड़े या उत्पाद से हटा दिए जाते हैं। ग्राहक पर count "रिकॉर्ड सेट" की सदस्यता लें।

// Server 
Meteor.publish('count', function() { 
    // Build a document from scratch 
    var self = this; 
    var uuid = Meteor.uuid(); 
    var count = Products.find().count(); 
    // Assign initial Products count to document attribute 
    self.set('count', uuid, {count: count}); 

    // Observe Products for additions and removals 
    var handle = Products.find().observe({ 
     added: function (doc, idx) { 
      count++; 
      self.set('counts', uuid, {count: count}); 
      self.flush(); 
     }, 
     removed: function (doc, idx) { 
      count--; 
      self.set('counts', uuid, {count: count}); 
      self.flush(); 
     } 
    }); 
    self.complete(); 
    self.flush(); 
    self.onStop(function() { 
     handle.stop(); 
    }); 
}); 

// Client 
Counts = new Meteor.Collection('count'); 
Meteor.subscribe('count'); 
console.log('Count: ' + Counts.findOne().count); 
+1

बहुत अच्छी चाल - मैं डीडीपी प्रोटोकॉल पर घटनाबद्ध ट्यूटोरियल को देखने की भी सिफारिश करता हूं जो कुछ मूलभूत बातें समझने के लिए कुछ मूल बातें देता है : http://www.eventedmind.com/posts/meteor- सदस्यताएं- और-ddp – sarfata

0

मुझे कहना पड़ेगा ऊपर समाधान मुझे एक तरह से पता चला है, लेकिन अभी भी, क्या हुआ अगर मैं ग्राहक डेटा है कि निरीक्षण के साथ कनेक्ट नहीं होते हैं प्रकाशित करने की जरूरत()? या किसी संग्रह के साथ?

मेरे मामले में मेरे पास 1000 उत्पाद हैं। आगंतुकों को शामिल करने के लिए मैं यादृच्छिक संख्या के उत्पादों का टाइमस्टैम्प अपडेट करके और टाइमस्टैम्प द्वारा क्रमबद्ध संग्रह प्रदर्शित करके संग्रह को "रीफ्रेशिग" कर रहा हूं। इस आगंतुकों के लिए इंप्रेशन है कि कुछ हो रहा है।

मेरा refresh विधि उत्पाद की संख्या लौटाता है (यह यादृच्छिक है)। मुझे उस नंबर को सभी ग्राहकों को पास करने की आवश्यकता है। मैंने यह किया, लेकिन (मुझे लगता है) बदसूरत कामकाज का उपयोग कर।

मेरा refresh विधि Session.set('lastRandomNo', random) सेट करता है। बीटीडब्ल्यू: मुझे नहीं पता था कि सत्र सर्वर पर काम करता है। refresh अद्यतन उत्पाद संग्रह।

फिर ऊपर जवाब के accoriding:

Meteor.publish 'refreshedProducts', -> 

self = this 
uuid = Meteor.uuid() 

# create a new collection to pass ProductsMeta data 
self.set('products_meta', uuid, { refreshedNo: 0 }) 

handle = Products.find().observe 
    changed: (newDocument, atIndex, oldDocument) -> 
    self.set('products_meta', uuid, { refreshedNo: Session.get('lastRandomNo') }) 
    self.flush() 

self.complete() 
self.flush() 
self.onStop -> 
    handle.stop() 

और क्लाइंट साइड पर:

ProductsMeta = new Meteor.Collection('products_meta') 

# subscribe to server 'products_meta' collection that is generated by server 
Meteor.subscribe('refreshedProducts') 

ProductsMeta.find({}).observe 
    changed: (newDocument, atIndex, oldDocument) -> 

    # I have access to refreshedNo by 
    console.log ProductsMeta.findOne().refreshedNo 

आप क्या सोचते हैं?