2012-06-13 15 views
9

मुझे लगता है कि इस तरह दिखता है एक टेम्पलेट है के बाद:भागो जे एस एक उल्का प्रतिपादन टेम्पलेट

<template name="foo"> 
    <textarea name="text">{{contents}}</textarea> 
</template> 

मैं के साथ प्रस्तुत करना:

Template.foo = function() { 
    return Foos.find(); 
} 

और मैं कुछ ईवेंट हैंडलर्स है:

Template.foo.events = { 
    'blur textarea': blurHandler 
} 

मैं जो करना चाहता हूं वह rowstextarea की सामग्री को इसके सामग्री के आकार के आधार पर सेट करना है। मुझे एहसास है कि मैं एक हैंडलबर्स सहायक लिख सकता हूं, लेकिन इसे डीओएम तत्व प्रदान करने की पहुंच नहीं होगी, जो मुझे कुछ अनावश्यक डुप्लिकेशंस करने के लिए मजबूर करेगी। मैं जो चाहता हूं, आदर्श रूप से, एक तत्व प्रदान किए जाने के बाद एक घटना को ट्रिगर करने के लिए उल्का के लिए है। कुछ ऐसा:

Template.foo.events = { 
    'render textarea': sizeTextarea 
} 

क्या यह संभव है?

अपने अनुप्रयोग जे एस में, ग्राहक खंड ग्राहक पर वहाँ जो कुछ जावास्क्रिप्ट चलेंगे: यकीन है कि अगर यह "सही तरीके से" नहीं है, लेकिन यह मेरे लिए काम करता है -

+0

संभावित डुप्लिकेट [DOM के बाद कॉलबैक Meteor.js में अपडेट किया गया था] (http: // stackoverflow।कॉम/प्रश्न/1010 9 788/कॉलबैक-बाद-द-डोम-अपडेट-इन-मेटियर-जेएस) –

उत्तर

15

मुझे लगता है कि यह करने के लिए वर्तमान 'सर्वश्रेष्ठ' तरीका है (यह एक हैक का थोड़ा सा है) Meteor.defer ala Callback after the DOM was updated in Meteor.js का उपयोग करना है।

ज्योफ, उल्का devs में से एक है इसलिए अपनी बात सुसमाचार :)

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

तो, आप की तरह कुछ कर सकता है:

<textarea id="{{attach_textarea}}">....</textarea> 

और

Template.foo.attach_textarea = function() { 
    if (!this.uuid) this.uuid = Meteor.uuid(); 

    Meteor.defer(function() { 
    $('#' + this.uuid).whatever(); 
    }); 

    return this.uuid; 
} 

संपादित करें

नोट, 0.4.0 के रूप में, आप कर सकते हैं यह एक बहुत तदर्थ तरह से (के रूप में Sander द्वारा बताया) में:

Template.foo.rendered = function() { 
    $(this.find('textarea')).whatever(); 
} 
+0

यह सुनिश्चित करने के लिए कि मैं समझता हूं - यहां गतिशील आईडी रखने के बारे में कुछ भी जादुई नहीं है, बस यह कार्य प्रत्येक बार तत्व प्रदान किए जाने पर कहा जाएगा? अर्थात। आप इसे डेटा विशेषता या जो कुछ भी कर सकते हैं? – 7zark7

+0

हम्म, 'Meteor.defer'' सेटटाइमआउट (..., 0) 'के आसपास सिर्फ एक रैपर है, है ना? यह दृष्टिकोण मेरे लिए हुआ, लेकिन यह दृश्य झिलमिलाहट का कारण बन सकता है। मुझे वास्तव में एक पोस्ट-रेंडर हुक चाहिए जो ईवेंट लूप से पहले है। –

+0

ऐसा कहकर, मैं इस उत्तर को स्वीकार करने जा रहा हूं क्योंकि मेरा प्रश्न उस लिंक का डुप्लिकेट है जिसे आपने लिंक किया है (भले ही उस पर स्वीकार्य उत्तर आदर्श से दूर है)। –

0

हाँ मुझे ऐसा लगता है। उदाहरण के लिए:

if (Meteor.is_client) { 
    $(function() { 
     $('textarea').attr('rows' , 12) // or whatever you need to do 
    }) 
    ... 

नोट उदाहरण यहाँ JQuery, जिस स्थिति में आप ग्राहक (मैं :-) सोचने के लिए इस प्रदान करने की आवश्यकता का उपयोग करता है। मेरे मामले में:

मैंने एक/क्लाइंट डीआईआर बनाया, और इसके तहत jquery.js फ़ाइल जोड़ा।

उम्मीद है कि इससे मदद मिलती है।

+1

समस्या यह है कि हालांकि यह प्रारंभिक ड्रॉ पर काम कर सकता है, लेकिन यदि तत्व कभी भी प्रतिक्रियाशील रूप से फिर से चला जाता है तो यह समस्याओं में भाग लेगा । –

+0

ओह हाँ सच है, धन्यवाद – 7zark7

+0

इसके अलावा, jQuery को उल्का के साथ शामिल नहीं किया गया है? मेरे पास कहीं भी jquery.js फ़ाइल नहीं है और मैंने कोई विशेष jQuery पैकेज नहीं जोड़ा है, लेकिन मैं अपने उल्का अनुप्रयोगों में बस jQuery का उपयोग कर सकता हूं। –

19

की उल्का 0.4.0 यह अगर एक टेम्पलेट प्रतिपादन समाप्त हो गया है की जाँच करने के लिए संभव है के रूप में, देखने के http://docs.meteor.com/#template_rendered

तो मैं समझता हूँ आपके सवाल का सही ढंग से, आप एक Template.foo.onRendered समारोह के अंदर अपने पाठ क्षेत्र आकार बदलने कोड लपेट चाहिए:

Template.foo.onRendered(function() { 
    this.attach_textarea(); 
}) 
2

के बाद से जून 2014 के बारे में, यह करने के लिए सही तरीका एक कॉलबैक Template.myTemplate.onRendered() का उपयोग कर स्थापित करने के लिए किया गया है।

+0

यह केवल एक बार, हर समय आग नहीं करता है। – Egor

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