2013-07-11 6 views
6

मेरे पास टेम्पलेट में {{renderNav}} नामक एक टेम्पलेट सहायक है Navएक और टेम्पलेट के बाद एक उल्का टेम्पलेट सहायक फिर से चलाने/प्रस्तुत करने के लिए कैसे प्रस्तुत किया गया है?

उदा।

Template.Nav.renderNav 

और कहा कि सहायक समारोह मैं सहायक

Template.contentWindow.content 

जो

{{content}} 
के लिए एचटीएमएल प्रदान करता है एक अलग टेम्पलेट

उदाहरण के लिए अंदर एक और सहायक के प्रदान की गई उत्पादन पार्स करने के लिए चाहते हैं के भीतर

और मेरा रेंडरनव हेल्पर उस HTML को भागना चाहता है जो {{cont एटी}}

{{renderNav}} 

के लिए एचटीएमएल उत्पन्न करने के लिए मैं यह कैसे करूँगा? अभी {{renderNav}} सहायक के लिए कार्यान्वित या अधिक तेजी से चलाता है और इसलिए यह एचटीएमएल कि बदल देता है पार्स करने में अक्षम है {{सामग्री}}

@Hugo - मैं अपने कोड में निम्नलिखित हैं कि आप सुझाव के रूप में

Template.contentWindow.rendered = function() { 
    debugger; 
    return Session.set('entryRendered', true); 
}; 

Template.Nav.renderNav = function() { 
    debugger; 
    var forceDependency; 
    return forceDependency = Session.get('entryRendered'); 
}; 

जब मैं इसे चलाता हूं, तो डिबगर पहले रेंडरनव सहायक को निष्पादित करते समय बंद हो जाता है। (जो दौड़ की स्थिति के संदर्भ में जो देख रहा हूं उसके साथ मुझे समझ में आता है)। फिर contentWindow प्रस्तुत करता है और मैंने सत्र.सेट ('एंट्री रेंडर', सत्य) के ऊपर ब्रेकपॉइंट मारा। लेकिन फिर renderNav फिर से नहीं चलता है जैसा कि आप सुझाव देते हैं कि यह चाहिए। क्या मैंने आपके सुझाव को गलत तरीके से गलत तरीके से लागू किया है या गलत तरीके से लागू किया है?

+0

सुनिश्चित नहीं हैं कि आपके करने की कोशिश कर रहे हैं। मान लीजिए कि 'सामग्री'' प्रस्तुत करने से पहले समाप्त होता है। 'RenderNav' के भीतर से आप' content' html तक कैसे पहुंच सकते हैं? – Xyand

+0

मैं एचटीएमएल तक पहुंचने की कोशिश कर रहा हूं कि सामग्री सहायक रेंडरनव हेल्पर के भीतर से प्रस्तुत करता है। जो कि दौड़ की स्थिति का कारण बन रहा है जहां renderNav पहले निष्पादित करता है और सामग्री सहायक सहायक डीओएम एचटीएमएल तक पहुंचने में सक्षम नहीं है। – funkyeah

+0

हालांकि आप इसे हैक कर सकते हैं, ऐसा लगता है कि आप कुछ गलत तरीके से कर रहे हैं। आपको अपने द्वारा प्रस्तुत किए गए टेम्पलेट के DOM की आवश्यकता क्यों है? आपके पास 'renderNav' संदर्भ में आवश्यक सभी डेटा होना चाहिए। हो सकता है कि आप कुछ 'renderNav' कोड जोड़ सकें ताकि यह समझाया जा सके कि यह' सामग्री 'DOM सेगमेंट का उपयोग कैसे करता है। – Xyand

उत्तर

4

आपको उस टेम्पलेट में निर्भरता की आवश्यकता है जिसे आप पुन: चालू करना चाहते हैं। आप जो डेटा प्राप्त करना चाहते हैं उसके आधार पर कुछ संभावनाएं हैं।

उदाहरण के लिए, आप content टेम्पलेट में एक प्रतिक्रियाशील मार्कर सेट कर सकते हैं जो renderNav को सूचित करेगा कि यह ड्राइंग के साथ किया गया है।

Template.contentWidnow.rendered = function() { 
    ... 

    // Set this on the very end of rendered callback. 
    Session.set('contentWindowRenderMark', '' + 
     new Date().getTime() + 
     Math.floor(Math.random() * 1000000)); 
} 


Template.renderNav.contentData = function() { 
    // You don't have to actually use the mark value, 
    // but you need to obtain it so that the dependency 
    // is registered for this helper. 
    var mark = Session.get('contentWindowRenderMark'); 

    // Get the data you need and prepare for displaying 
    ... 
} 

 


 

अधिक जानकारी के साथ

आपके द्वारा दिए गए, हम इस तरह कोड बना सकते हैं:

content.js

Content = {}; 
Content._dep = new Deps.Dependency; 

contentWindow.js

Template.contentWidnow.rendered = function() { 
    Content.headers = this.findAll(':header'); 
    Content._dep.changed(); 
} 

renderNav।js

Template.renderNav.contentData = function() { 
    Content._dep.depend(); 
    // use Content.headers here 
    ... 
} 
+0

ह्यूगो, मैं देखता हूं कि आप क्या सुझाव दे रहे हैं लेकिन यह काम नहीं कर रहा है। मैंने आपके सुझाव के आधार पर आपके प्रश्नों के बारे में एक संपादन किया है जो मैंने आपके सुझाव के आधार पर किया था। – funkyeah

+0

'सत्य' सेट करना काम नहीं करना चाहिए। क्योंकि यह पहली बार छोड़कर मूल्य नहीं बदलता है। 'रैंडम' या इससे भी बेहतर 'Deps.Dependency' – Xyand

+0

का उपयोग करें हां, मेरे उदाहरण में मैं 'दिनांक()' का उपयोग करता हूं और यह सुनिश्चित करने के लिए कि कुछ मूल्य बदल गया है, कुछ 'यादृच्छिक()' भी जोड़ें। कस्टम 'Deps.Dependency 'ऐसा करने का एक और वैध तरीका है,' सत्र 'से भी बेहतर (निचला स्तर) - बशर्ते कि आपके पास टेम्पलेट फ़ाइलों के बीच निर्भरता साझा करने का एक अच्छा तरीका है। –

3

आप चाहते हैं स्वचालित रूप से पुनर्निर्माण की नेविगेशन जब contentWindow, renders के रूप में हुबर्ट ओजी सुझाव दिया, आप भी एक क्लीनर, अमान्य संदर्भों के निचले स्तर तरीके से उपयोग कर सकते हैं:

var navDep = new Deps.Dependency; 

Template.contentWindow.rendered = function() { 
    ... 
    navDep.changed(); 
} 

Template.renderNav.contentData = function() { 
    navDep.depend(); 

    // Get the data you need and prepare for displaying 
    ... 
} 

देखें http://docs.meteor.com/#deps अधिक जानकारी के लिए।

, तो दूसरी ओर, आप मैन्युअल अन्य टेम्पलेट को रखना चाहते हैं, तो आप इसे एक समारोह के रूप कॉल कर सकते हैं:

var html = Template.contentWindow(); 

लौटे एचटीएमएल प्रतिक्रियाशील नहीं होगा। आप प्रतिक्रिया की जरूरत है, का उपयोग करें:

var reactiveFragment = Meteor.render(Template.contentWindow); 

यह कैसे काम करता पर जानकारी के लिए स्पार्क और प्रतिक्रियात्मकता पर http://www.eventedmind.com/ पर स्क्रीनकास्ट देखें।

अद्यतन

अपने डोम के लिए एक गाया टुकड़ा जोड़ने के लिए:

document.body.appendChild(Meteor.render(function() { 
    return '<h1>hello</h1><b>hello world</b>'; 
})); 

तुम भी सीधे डोम एपीआई का उपयोग कर गाया नोड्स पहुँच सकते हैं:

console.log(reactiveFragment.childNodes[0]); 
+0

मुझे लगता है कि यह सही है लेकिन मेरे लिए काम नहीं कर रहा है, इसलिए मैं खुदाई रखूंगा ... निर्भरता के साथ सामग्रीडेटा सहायक पहले अपेक्षा के अनुसार निष्पादित करता है, फिर सामग्रीविंडो। navDep.changed() को कॉल करने वाले निष्पादित निष्पादित किए जाते हैं, जो बदले में सामग्री डेटा को ट्रिगर करने के लिए ट्रिगर करता है (जो वास्तव में मैं चाहता हूं!), दुर्भाग्य से सामग्रीडेटा हेल्पर सही एचटीएमएल वापस करने के लिए प्रतीत होता है, डीओएम को कुछ भी नहीं दिया जाता है और न ही सहायकों को फिर से निष्पादित किया जाता है (जहां से पहले मैं डोम को प्रस्तुत सामग्री प्राप्त कर रहा था, यह वर्तमान पृष्ठों की बजाय पिछले पृष्ठ की सामग्री थी) – funkyeah

+0

क्या आप renderNav के अंदर प्रतिक्रियाशील फ़्रेगमेंट का उपयोग कर रहे हैं? फिर आप एक निर्भरता पाश बना रहे हैं, जहां सामग्रीविंडो renderNav पर निर्भर करता है और renderNav सामग्री पर निर्भर करता हैविंडो। – konrad

+0

नहीं, मैंने अभी भी आपके पोस्ट के पहले भाग में दिखाए गए नेविप कोड को डाला है जबकि बाकी सबकुछ वही है। यह पूरी तरह से मुझे स्पष्ट नहीं है कि मैं इस स्थिति में प्रतिक्रियाशील फ्रैगमेंट कोड का उपयोग कैसे करूंगा। क्या यह विचार है कि मैं Meteor.render (Template.contentWindow) को कॉल करूंगा; रेंडरनव हेल्पर के भीतर से और फिर मेरे एनवी पार्सिंग को उस डीओएम एचटीएमएल की बजाय एचटीएमएल वापस कर दिया? – funkyeah

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