2013-07-18 4 views
7

मान लीजिए मेरे पास एक उल्का संग्रह है जिसे GameStatus कहा जाता है। मेरे पास अलग-अलग भूमिकाओं वाले उपयोगकर्ता हैं, लेकिन मैं सभी उपयोगकर्ताओं के लिए गेमस्टैटस संग्रह प्रकाशित करता हूं। मैं बस सर्वर में निम्नलिखित/publications.coffeeउल्का ढूंढें एक प्रश्न टेम्पलेट सहायक में अपरिभाषित एक क्वेरी देता है। अन्य टेम्पलेट हेल्पर्स में, एक ही क्वेरी अच्छी तरह से काम करती है

Meteor.publish 'gamestatus', -> 
    GameStatus.find() 

का उपयोग भूमिकाओं ('एस' और 'बी') मुझे कोई समस्या नहीं है जब मैं निम्नलिखित खाका सहायक का उपयोग किया है के दो के लिए (फाइल में परिभाषित क्लाइंट/विचारों/seller.coffee और क्लाइंट/विचारों/buyer.coffee)

currentRound: -> 
    return GameStatus.findOne().currentRound 

इन के लिए मैं निम्न त्रुटि कभी नहीं मिलता है।

Uncaught TypeError: Cannot read property 'currentRound' of undefined 

लेकिन एक और भूमिका ('व्यवस्थापक') के लिए, एक ही टेम्पलेट सहायक (फ़ाइल क्लाइंट/विचारों/admin.coffee में परिभाषित) का उपयोग करके उपरोक्त शो Uncaught TypeError देता है। यह काम करता है अगर मैं इसके बजाय लिखता हूं:

currentRound: -> 
    return GameStatus.findOne()?.currentRound 

मुझे समझ में आता है कि यह क्यों काम करता है। मुझे लगता है कि संग्रह लोड होने पर संग्रह पहले उपलब्ध नहीं है, फिर यह उपलब्ध हो जाता है। लेकिन यह ऊपर दिखाए गए अन्य टेम्पलेट्स के लिए क्यों नहीं होता है?

अगर कोई इसे स्पष्ट करने में मदद कर सकता है तो वास्तव में सराहना करेंगे।

+0

जब आप संग्रह की सदस्यता लेते हैं, तो कॉल में वापस कंसोल पर कुछ लॉग इन करें ताकि आप जान सकें कि यह कब उपलब्ध है, और कॉल के साथ वही काम करें जो विफल हो रहा है। इस तरह आप अपनी परिकल्पना का परीक्षण कर सकते हैं। –

+0

@ एमआरडी क्या आप कृपया मुझे एक उदाहरण दे सकते हैं? मुझे लॉग इन करना चाहिए जो सदस्यता को उपलब्ध होने पर मुझे जानने में मदद करेगा। ऐसा लगता है कि यह केवल इस विशिष्ट भूमिका के लिए है कि वे शुरुआत में उपलब्ध नहीं हैं। – Curious2learn

+0

आप अपनी सदस्यता के लिए ऐसा कुछ करना चाहते हैं https://gist.github.com/devonbarrett/b698c10cc427ee2c1811 और उसके बाद वर्तमान राउंड फ़ंक्शन के लिए कुछ समान लॉग करें और देखें कि संग्रह तैयार होने से पहले इसे निकाल दिया गया है –

उत्तर

13

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

संग्रहों से निपटने का एक त्वरित और गंदा तरीका है जो तैयार नहीं हैं, और टोडोस उदाहरण में एक अधिक परिष्कृत समाधान मिल सकता है।

त्वरित और गंदे समाधान इस तरह दिखेगा।

currentRound: -> 
    gameStatusrecord = GameStatus.findOne(); 
    if(gameStatusRecord) 
    gameStatusRecord.currentRound 

यह काम करेगा। संग्रह तैयार होने तक, वर्तमानराउंड शून्य वापस आ जाएगा, और आपका टेम्पलेट संक्षेप में प्रस्तुत करेगा और शायद वर्तमान दौर के लिए बस एक खाली दिखाएगा। तो आदर्श उपयोगकर्ता अनुभव नहीं बल्कि एक बड़ा सौदा नहीं है।

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

var listsHandle = Meteor.subscribe('lists', function() { 

फिर todos की लाइन 80 पर सूचियों टेम्पलेट के लिए एक सहायक समारोह को परिभाषित करता है:

उदाहरण के लिए, सब उदाहरण में, ग्राहक "सूचियों" संग्रह में todos.js की लाइन 24 पर सब्सक्राइब .js

Template.lists.loading = function() { 
    return !listsHandle.ready(); 
}; 

फिर todos.html लाइन 20 में सूचियों टेम्पलेट में, यह किसी भी टेम्पलेट्स प्रस्तुत करना है जब तक कि listsHandle तैयार है कोशिश नहीं करता।

<h3>Todo Lists</h3> 
{{#if loading}} 
    <div id="lists">Loading...</div> 
{{else}} 
    <div id="lists"> 
    {{#each lists}} 
    <!--etc.--> 
+0

धन्यवाद आपके सुझाव। – Curious2learn

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