2012-12-08 15 views
6

मुझे उल्का के साथ चलने में कोई समस्या है।उल्का टेम्पलेट पुनः लोड अनंतता

मेरे पास एक "प्रश्न" पृष्ठ है जिसे मैं प्रस्तुत किए जाने पर गिनती दृश्य को बढ़ाना चाहता हूं।

तो मेरे टेम्पलेट समारोह में मैं लिखने

Template.questionview.helpers({ 
    question : function() { 
     if(Session.equals('main_template_name', 'question')) { 
     console.log(Session.get('question_id')); 
     Questions.update({ 
      _id: Session.get('question_id') 
     }, { 
      $inc: { 
      views: 1 
     } 
    }); 
    } 
}); 

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

किसी के पास सुझाव हैं?

उत्तर

4

आमतौर पर, इस तरह की स्थितियों में, मॉडल के बारे में कुछ तोड़ दिया जाता है। इस मामले में, मेरा मानना ​​है कि यह "गिनती दृश्य" विचार है। इसे सही तरीके से करने के कई तरीके हैं। प्रस्तुत करने पर इसे बढ़ाना नहीं है, क्योंकि आप यूआई कोड में मॉडल काम कर रहे हैं (अवधारणात्मक रूप से और कार्यान्वयन में टूटा हुआ)।

पहले, सवाल उपयोगकर्ता कहीं का दौरा किया दुकान। उपयोगकर्ता पर {questionsVisited:[]} संपत्ति क्यों नहीं?

बजाय एक दृश्य रजिस्टर करने के लिए एक Meteor.call(...) विधि कॉल का उपयोग करें:

Meteor.methods({ 
    viewQuestion: function(questionId) { 
    // check if the user hasn't visited this question already 
    var user = Meteor.users.findOne({_id:this.userId,questionsVisited:{$ne:questionId}}); 

    if (!user) 
     return false; 

    // otherwise, increment the question view count and add the question to the user's visited page 
    Meteor.users.update({_id:this.userId},{$addToSet:{questionsVisited:questionId}}); 
    Questions.update({_id:questionId},{$inc:{views:1}}); 
    return true; 
}); 

तो यूआई परिवर्तन पर दृश्य बढ़ाने के बारे में? खैर, चलो विशेष रूप से ऐसा नहीं करते हैं। के देखे जाने की संख्या केवल जब सवाल परिवर्तन को बढ़ा देते हैं।

Meteor.autorun(function() { 
    var questionId = Session.get("question_id"); 
    Meteor.call('viewQuestion',questionId,function(e,r) { 
    if (r) 
     console.log("Question " + questionId + " logged an increment."); 
    else 
     console.log("Question " + questionId + " has already been visited by user " + Meteor.userId(); 
    }); 
}); 

और यह सब सवाल सहायक सामान से छुटकारा पाने के ...

यह वही है आप मूल रूप से चाहता था से भी बेहतर है। अब एक ही उपयोगकर्ता के लिए विचारों की गणना दो बार नहीं की जाती है। यदि वह वांछित व्यवहार है, तो questionsVisited तर्क हटा दें।

केवल'question_id' सत्र चर बदलें जब आप वास्तव में उस तर्कसंगत प्रश्न को बदलते हैं जिसमें उपयोगकर्ता काम कर रहा है।

+0

आप शानदार हैं। मुझे उपयोगकर्ता में प्रश्न या प्रश्न_आईडी में उपयोगकर्ता_आईडी का दौरा किया जाना चाहिए था, जैसा कि आप सुझाते हैं। मुझे लगता है कि आपका समाधान क्लीनर है। मैं अभी भी उल्का का एक शिक्षार्थी हूं। क्या मैं पूछ सकता हूं कि मुझे सहायक सामग्री से छुटकारा क्यों मिलना चाहिए। – user857188

0

एक सहायक में डालने की बजाय, मैं इस तर्क को प्रस्तुत कार्यक्रम में रखूंगा, यानी।

Template.questionview.rendered ... 

the Meteor docs देखें।

+0

सहायता के लिए धन्यवाद। मैंने वास्तव में पहले कोशिश की है। हालांकि यह वही है। मुझे लगता है कि ऐसा इसलिए है क्योंकि जब मैं प्रश्न अद्यतन करता हूं, तो प्रश्नपत्र टेम्पलेट फिर से प्रस्तुत किया जाएगा। एक बार इसे फिर से प्रस्तुत करने के बाद, प्रश्न अपडेट किया जाता है, और इसी तरह ... – user857188

+1

मुझे यकीन नहीं है कि पृष्ठ को रीफ्रेश न करने के लिए उल्का बताने का कोई तरीका है या नहीं। मेरा मतलब है कि उल्का से फिर से दृश्य को रीफ्रेश न करने के लिए कहें। – user857188

1

मैं इस समस्या meteor-collection-hooks

का उपयोग करके पहले यह

>_ meteor add matb33:collection-hooks 

फिर अपने मॉडल में स्थापित

Questions.after.findOne(function (userId, selector, options, doc){ 
    Questions.update({_id: doc._id},{$inc:{views:1}}); 
}); 

और KABOOM यही हल यह

0

आप उपयोग कर रहे हैं प्रकाशित और उप मुंशी (आप निश्चित रूप से वैसे भी चाहिए) आप इसे अपने प्रकाशित पद्धति पर

Meteor.publish('posts', function(id) { 
    Posts.update({_id:id},{$inc:{view:1}}); 
    return Posts.find({_id: id}); 
}); 

की तरह या अपने सदस्यता के कॉलबैक

Meteor.subscribe("posts" , id { 
    onReady: function() { Meteor.call("incrementView", id);}}); 

इस तरह से आप केवल संख्या में भी वृद्धि एक बार हर बार उन ब्राउज़र को खोलने पर कर सकते हैं।

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