2012-11-26 17 views
13

मैं मेटियर में विरासत का उपयोग करने की उम्मीद कर रहा हूं, लेकिन मुझे दस्तावेज़ में या स्टैक ओवरफ़्लो में इसके बारे में कुछ भी नहीं मिला।meteor.js में विरासत का उपयोग

क्या टेम्पलेट्स को अन्य अमूर्त टेम्पलेट, या कक्षा से गुणों और विधियों को विरासत में रखना संभव है?

+0

मैंने [एक पैकेज] (https://atmosphere.meteor.com/package/view) बनाया जो उल्का के लिए 'व्यू' कहा जाता है। मैं व्यू क्लास जैसे रीढ़ की हड्डी के साथ उल्का विचार लपेटने के लिए इसका उपयोग करता हूं। शायद आपको वहां से शुरू करने के लिए कुछ विचार मिलेंगे। – Andreas

उत्तर

18

मुझे लगता है कि कम जवाब नहीं है, लेकिन यहाँ एक लंबे समय तक इस सवाल का जवाब है:

एक बात मैं टेम्पलेट्स के बीच कार्यक्षमता को साझा करने से किया है की तरह सहायकों का एक उद्देश्य को परिभाषित है, और फिर एक से अधिक टेम्पलेट निर्दिष्ट करने के लिए, है इसलिए:

var helpers = { 
    displayName: function() { 
     return Meteor.user().profile.name; 
    }, 
}; 

Template.header.helpers(helpers); 
Template.content.helpers(helpers); 

var events = { 
    'click #me': function(event, template) { 
     // handle event 
    }, 
    'click #you': function(event, template) { 
     // handle event 
    }, 
}; 

Template.header.events(events); 
Template.content.events(events); 

यह विरासत नहीं है, बिल्कुल, लेकिन यह आपको टेम्पलेट्स के बीच कार्यक्षमता साझा करने में सक्षम बनाता है।

आप एक सहायक की पहुंच है करने के लिए सभी टेम्पलेट्स चाहते हैं, आप की तरह तो (https://github.com/meteor/meteor/wiki/Handlebars देखें) एक वैश्विक सहायक परिभाषित कर सकते हैं:

Handlebars.registerHelper('displayName',function(){return Meteor.user().profile.name;}); 
+0

यह काफी उपयोगी है। धन्यवाद। घटनाओं को विस्तारित करने के बारे में कैसे? वहाँ कोई विचार है? – Gezim

+0

मैं उसी तरह से पूरी तरह से संतोषजनक निष्कर्ष पर नहीं आया .. –

+0

@Pilgrim मैंने घटनाओं के लिए कुछ उदाहरण भी जोड़े। – zorlak

2

मैं इस सवाल here दिए गए हैं। जबकि समाधान inheritance का उपयोग नहीं करता है, यह आपको आसानी से टेम्पलेट्स पर ईवेंट और हेल्पर्स साझा करने की अनुमति देता है।

extendTemplate = (template, mixin) -> 
    helpers = ({name, method} for name, method of mixin when name isnt "events") 
    template[obj.name] = obj.method for obj in helpers 

    if mixin.events? 
    template.events?.call(template, mixin.events) 

    template 

अधिक जानकारी के लिए और एक उदाहरण मेरे other answer देखें:

संक्षेप में, मैं एक extendTemplate समारोह जो एक टेम्पलेट में ले जाता है और तर्कों के रूप सहायकों और घटनाओं के साथ एक वस्तु को परिभाषित।

+0

ओओपी में सबसे अच्छा जवाब यह है कि आप "विरासत पर रचना" का उपयोग करने की अनुशंसा करते हैं और यह उत्तर पूर्व के पक्ष में है। –

1

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

असल में, पूरे विधि इस प्रकार है:

// Defines new method /extend 
Template.prototype.copyAs = function (newTemplateName) { 
    var self = this; 

    // Creating new mirror template 
    // Copying old template render method to keep its template 
    var newTemplate = Template.__define__(newTemplateName, self.__render); 
    newTemplate.__initView = self.__initView; 

    // Copying helpers 
    for (var h in self) { 
     if (self.hasOwnProperty(h) && (h.slice(0, 2) !== "__")) { 
      newTemplate[h] = self[h]; 
     } 
    } 

    // Copying events 
    newTemplate.__eventMaps = self.__eventMaps; 

    // Assignment 
    Template[newTemplateName] = newTemplate; 
}; 

अपने नए टेम्पलेट में (new_template.js) जिसमें आप अपने सार एक का विस्तार करना चाहते हैं, तो निम्न लिखें:

// this copies your abstract template to your new one 
Template.<your_abstract_template_name>.copyAs('<your_new_template_name>'); 

अब , आप या तो अपने हेल्पर्स या घटनाओं को ओवरराइट कर सकते हैं (मेरे मामले में यह photos सहायक) निम्नलिखित है:

Template.<your_new_template_name>.photos = function() { 
    return []; 
}; 

आपकी इच्छा ओवरराइट सहायक सहायक विधियों और उन सार तत्वों को संदर्भित करती है जिन्हें अधिलेखित नहीं किया जाता है।

ध्यान दें कि नए टेम्पलेट के लिए HTML फ़ाइल आवश्यक नहीं है क्योंकि हम हर समय सार को संदर्भित करते हैं।

स्रोत कोड गीथब here पर उपलब्ध है!

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