2013-05-27 11 views
8

मेरे पास एक बड़े "संदेश" संग्रह के साथ एक मोंगो डीबी है; एक विशिष्ट groupId से संबंधित सभी संदेश। इस तरहसंग्रह से स्पष्ट रूप से सदस्यता समाप्त कैसे करें?

Meteor.publish("messages", function(groupId) { 
    return Messages.find({ 
    groupId: groupId 
    }); 
}); 

और एक सदस्यता:: तो यह की तरह एक प्रकाशन के साथ शुरू कर दिया है

Deps.autorun(function() { 
    return Meteor.subscribe("messages", Session.get("currentGroupId")); 
}); 

यह मैं मुसीबत में मिल गया है क्योंकि शुरू में currentGroupId अपरिभाषित है लेकिन चौखट mongod संदेशों को खोजने के सीपीयू का प्रयोग करेंगे groupId == null के साथ (हालांकि मुझे पता है कि कोई नहीं है)।

Meteor.publish("messages", function(groupId) { 
    if (groupId) { 
    return Messages.find({ 
     groupId: groupId 
    }); 
    } else { 
    return {}; // is this the way to return an empty publication!? 
    } 
}); 

और/या करने के लिए सदस्यता के पुनर्लेखन के लिए:

Deps.autorun(function() { 
    if (Session.get("currentGroupId")) { 
    return Meteor.subscribe("messages", Session.get("currentGroupId")); 
    } else { 
    // can I put a Meteor.unsubscribe("messages") here!? 
    } 
}); 

जो दोनों शुरू में मदद करता है

अब, मैं इस प्रकार के प्रकाशन को फिर से लिखने की कोशिश की। लेकिन जैसे ही currentGroupId फिर से अपरिभाषित हो जाता है (क्योंकि उपयोगकर्ता एक अलग पृष्ठ पर नेविगेट करता है), mongod अभी भी अंतिम सदस्यता groupId के लिए डेटाबेस की आवश्यकता में व्यस्त है। तो मैं एक प्रकाशन से सदस्यता कैसे ले सकता हूं जैसे कि मोंगोड पूछताछ बंद कर दिया गया है?

उत्तर

5

सीधे शब्दों में प्रकाशन के लिए एक शर्त जोड़ने:

Meteor.publish("messages", function(groupId) { 
    if (groupId) { 
    return Messages.find({ 
     groupId: groupId 
    }); 
}); 

और सदस्यता रखने:

Deps.autorun(function() { 
    return Meteor.subscribe("messages", Session.get("currentGroupId")); 
}); 

नौकरी करता है।

प्रकाशन को स्पष्ट रूप से रोकने की कोई आवश्यकता नहीं है। आखिरकार, वर्तमान में चल रही क्वेरी को खत्म करने और अभी तक एक और जारी करने के बाद मोंगोडीबी को अब पूछताछ नहीं की गई है (जो कि सिस्टम में कहीं भी कतारबद्ध है)।

+0

दुर्भाग्यवश, मुझे इस दावे को साबित करने के लिए कोई दस्तावेज नहीं मिला। एक संकेत की सराहना की जाएगी। – Dejan

7

प्रलेखन के अनुसार यह होना चाहिए http://docs.meteor.com/#publish_stop

this.stop() प्रकाशित समारोह अंदर लिए बुलाया गया। इस ग्राहक की सदस्यता रोकता है; ऑनर कॉलबैक क्लाइंट पर नहीं लगाया जाता है।

तो

Meteor.publish("messages", function(groupId) { 
    if (groupId) { 
    return Messages.find({ 
     groupId: groupId 
    }); 
    } else { 
    return this.stop(); 
    } 
}); 

और मैं क्लाइंट की तरफ लगता है कि आप बस को हटा सकते हैं की तरह कुछ अपने अगर/किसी और अपना पहला उदाहरण

Deps.autorun(function() { 
    return Meteor.subscribe("messages", Session.get("currentGroupId")); 
}); 
+2

मुझे लगता है कि आप एक प्रकार यहां की है। 'संदेशों' में 'स्टॉप' विधि नहीं है। मुझे लगता है कि यह कहना चाहिए 'इसे वापस करें। स्टॉप();' इसके बजाए। – Dejan

+1

मुझे विश्वास है कि आप सही हैं, कॉल स्टॉप() के अनुसार, कॉलर() Meteor.publish का एक तरीका है, इसलिए मैंने इसे इस पर बदल दिया। Stop()। – Michael

+0

अब, मजाकिया बात यह है कि कॉल को रोकने के लिए छोड़ना() व्यवहार को बदलता नहीं है। मेरे जवाब पर एक नज़र डालें। – Dejan

0
अपने मामले में

में की तरह, आप बंद कर देना चाहिए autorun

documentation

में एक उदाहरण है

आपका ऑटोरन वास्तव में एक पैरामीटर है कि अनुमति देता है के साथ कहा जाता है आप इसे रोकने के लिए:

Deps.autorun(function (c) { 
    if (! Session.equals("shouldAlert", true)) 
    return; 

    c.stop(); 
    alert("Oh no!"); 
}); 
+0

'autorun' को रोकना मदद नहीं करेगा क्योंकि' currentGroupId' अब शून्य नहीं होने के बाद मुझे फिर से संदेशों को लोड करने की आवश्यकता है (यानी सदस्यता लें)। – Dejan

6

मैंने पाया इसे और अधिक सरल और सीधी-सपाट हैंडलर जो .subscribe() कॉल से दिया जाता है पर .stop() समारोह कॉल करने के लिए:

let handler = Meteor.subscribe('items'); 
... 
handler.stop(); 
संबंधित मुद्दे