2012-11-09 9 views
5

क्या कोई मुझे उल्का टेम्पलेट व्यवहार को समझने में मेरी सहायता कर सकता है?मेटीर.जेएस टेम्पलेट्स को डेटा के बिना प्रतिपादन से कैसे रोकें

मैं एप्पल ग्रोल के समान, मेरी परियोजना में एक अधिसूचना प्रणाली को कार्यान्वित करना चाहता हूं। यह संदेश प्रकट होने के लिए सरल jQuery प्रभावों का उपयोग करता है, जब डेटाबेस में एक रिकॉर्ड लिखा जाता है। मैं कोड उदाहरण सरल बना दिया है, आवश्यक समस्या को दिखाने के लिए:

कोड:

var Messages = new Meteor.Collection("messages"); 

if (Meteor.isClient) { 
    Template.Notification.Message = function() { 
    return Message.findOne({}, {sort: {seq: -1}}); 
    }; 

    Template.Notification.rendered = function() { 
    $("#livebar").fadeIn(400).delay(1000).fadeOut(400); 
    } 
} 

टेम्पलेट: पेज प्रदान की गई है

<template name="Notification"> 
<div class="row"> 
    <div class="span6 alert alert-error" id="livebar" style="display:none;"> 
     {{Messages.text}} 
    </div> 
</div> 
</template> 

हैं, तो एक खाली अदृश्य क्षेत्र प्रदान की गई हो जाता है jQuery प्रभाव के साथ, और बाद में सिस्टम प्रतिक्रियाशील डेटासॉर (संदेश) लोड करता है और क्षेत्र को फिर से प्रस्तुत करता है! मैंने इसे दो बार प्रतिपादन से रोकने की कोशिश की है, लेकिन सफल नहीं हुआ। त्रुटि ठीक करने के लिए काफी आसान प्रतीत होता है, लेकिन मैं यहाँ अटक गया हूँ। किसी भी सहायता के लिए धन्यवाद!

+0

टेम्पलेट.templateName.created और Meteor.defer – crapthings

उत्तर

3

आप टेम्पलेट कॉल {{> Notification}} को {{#if}} ब्लॉक से घिरा सकते हैं।

{{#if has_notifications}} 
    {{> Notifications}} 
{{/if}} 

//JS 
Template.foo.has_notifications = function() { 
    Message.find().count() > 0; 
}  

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

+0

इस कार्यवाही के लिए धन्यवाद, यह नौकरी करता है! \t \t {{संदेश #if}} \t \t

\t \t {{/ यदि}} केवल \t ' यह टेम्पलेट renderes \t' <टेम्पलेट नाम = "अधिसूचना">: यह और भी आसान हो जाता है डेटा स्रोत लोड होने के बाद। – dimkin

+1

क्या {{# # संदेश}} 'एक सहायक है या संदेश-संग्रह में तत्वों के अस्तित्व के लिए उल्का जांच करता है, इसे इस तरह से कॉल करके? – Andreas

+1

आप सही हैं, मेरा मतलब 'संदेश' नहीं था, लेकिन 'Template.Notification.Message' सहायक, जो पहले से ही इस टेम्पलेट के लिए उपलब्ध था। इसलिए, इसे '{{#if संदेश}}' – dimkin

3

आपको इस अतिरिक्त कोड की जरूरत है:

सबसे पहले अपनी परियोजना के अंदर टर्मिनल पर meteor remove autopublish निष्पादित।

दूसरा प्रकाशित करने के लिए क्या

//On isServer 
Meteor.publish('messages', function(){ 
    return Messages.find(); 
}); 

फिर उस डेटा की सदस्यता और इंतजार परिभाषित तक इसके लिए तैयार

//On isClient 
subscription_handle = Meteor.subscribe('messages'); 

Meteor.autorun(function(computation) { 
    if(subscription_handle.ready()) { 

     //The data is now ready, start your templates here 

     computation.stop(); //Stop autorun 
    } 
}); 

इसके अलावा, वर Messages = new Meteor.Collection("messages"); इसलिए इसकी एक वैश्विक चर के रूप में अपने संग्रह को परिभाषित।

आयरन राउटर में टेम्पलेट मार्ग की waitOn संपत्ति का उपयोग करने के लिए एक बिल्कुल अलग (लेकिन आसान) दृष्टिकोण है, इसलिए डेटा के बाद आपका टेम्पलेट प्रस्तुत होता है।

+0

हां पढ़ना चाहिए! यह सुनिश्चित करना होगा कि प्रतिपादन से पहले सदस्यता तैयार हो। एक lifesaver! – scald