2012-11-26 2 views
13

Ich habe gehofft, Vererbung in Meteor zu verwenden, aber ich konnte nichts darüber in der Dokumentation oder auf Stack Overflow finden.Vererbung in meteor.js verwenden

Ist es möglich, dass Vorlagen Eigenschaften und Methoden von einer anderen abstrakten Vorlage oder Klasse übernehmen?

+0

Ich erstellte [ein Paket] (https://atmosphere.meteor.com/package/view) namens 'view' für Meteor. Ich benutze es, um Meteor-Ansichten mit einer Rückgrat-ähnlichen Sichtklasse zu umhüllen. Vielleicht findest du dort ein paar Ideen. – Andreas

Antwort

18

Ich denke, die kurze Antwort ist nein, aber hier ist eine längere Antwort:

Eine Sache, die ich getan habe Funktionalität unter Vorlagen zu teilen, ist ein Objekt von Helfern zu definieren, und es dann zu mehreren Vorlagen zuweisen, wie also:

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); 

Es ist nicht Vererbung, genau, aber es ermöglicht Ihnen, Funktionalität zwischen Vorlagen zu teilen.

Wenn Sie alle Vorlagen wollen Zugriff auf einen Helfer haben, können Sie einen globalen Helfer definieren wie so (https://github.com/meteor/meteor/wiki/Handlebars sehen):

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

Das ist sehr nützlich. Vielen Dank. Wie wäre es mit der Verlängerung der Veranstaltungen? Irgendwelche Ideen da? – Gezim

+0

Ich kam irgendwie zu der gleichen nicht ganz befriedigenden Schlussfolgerung. –

+0

@Pilgrim Ich fügte einige Beispiele für Ereignisse hinzu. – zorlak

2

antwortet ich habe diese Frage here. Während die Lösung inheritance nicht verwendet, können Sie Ereignisse und Helfer problemlos über Vorlagen hinweg freigeben.

Auf den Punkt gebracht, definiere ich eine extendTemplate Funktion, die mit Helfern und Ereignisse als Argumente in einer Vorlage und ein Objekt nimmt:

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 

Weitere Informationen und ein Beispiel meine other answer sehen.

+0

Beste Antwort, in OOP wird empfohlen, dass Sie "Komposition über Vererbung" verwenden und diese Antwort bevorzugt die vorherige. –

1

Vor kurzem brauchte ich die gleiche Funktionalität in meiner App, also habe ich beschlossen, mein eigenes Paket zu erstellen, das diesen Job out of the box tun wird. Obwohl es noch in Arbeit ist, können Sie es ausprobieren.

Grundsätzlich ist das gesamte Verfahren ist wie folgt:

// 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; 
}; 

In Ihrer neuen Vorlage (new_template.js), in dem Sie Ihr Abstract ein verlängern möchten, schreiben Sie folgendes:

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

Jetzt Sie können einfach Ihre Helfer oder Ereignisse überschreiben (in meinem Fall ist es photos Helfer), indem Sie Folgendes tun:

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

Sie beziehen sich auf überschriebene Hilfsmethoden und auf abstrakte Methoden, die nicht überschrieben werden.

Beachten Sie, dass eine HTML-Datei für eine neue Vorlage nicht erforderlich ist, da wir ständig auf eine abstrakte Vorlage verweisen.

Der Quellcode ist auf Github here verfügbar!