2014-06-11 14 views
7

Ich weiß, es gibt diese Frage auf multiple inheritance/composition. Es scheint jedoch so zu sein, dass diese Frage mehr dazu dient, die Funktionalität von mehreren vorhandenen Elementen in anderen Elementen wiederzuverwenden. Und die Lösung dafür sind natürlich Mixins.So erweitern Sie mehrere Elemente mit Polymer

Ich würde gerne wissen, wie ich tatsächlich vorhandene Elemente "dekorieren" kann, ohne wirklich Funktionalität von ihnen zu leihen. Wir wissen, dass es diese extends Eigenschaft gibt, die verwendet werden kann, um ein vorhandenes Element mit Polymer zu erweitern.

So machen Sie eine normale <button> verhalten sich wie eine mega-button ist so einfach wie das Anfügen <button is="mega-button"> und schreiben Sie eine Komponente dafür. Aber es stellt sich heraus, dass es nicht möglich ist, mehrere Elemente zu extend. So etwas wie extends="foo bar" funktioniert nicht. Was, wenn ich eine Webkomponente erstellen möchte, die tatsächlich auf verschiedene Elemente angewendet werden kann?

Zum Beispiel möchte ich nicht nur <button> Elemente mit mega-button verlängern, aber wahrscheinlich auch ein <a> Element, so dass es so aussieht und verhält sich wie ein zu mega-button?

Der Mixin-Ansatz hilft hier nicht wirklich (soweit ich es verstehe), weil sie nichts anderes tun, als eine gemeinsame Logik für verschiedene Web-Komponenten bereitzustellen. Das bedeutet, dass Sie mehrere Komponenten erstellen und die Logik (die in einem Mixin gepackt wurde) wiederverwenden.

Was ich brauche, ist ein Weg, eine Web-Komponente zu erstellen, die Elemente mehrere angewendet werden kann.

Irgendeine Idee, wie man das löst?

UPDATE

Addy antwortete mit einigen Ansätzen, dass die Verwendung Fall zu behandeln. Hier ist ein Follow-up Frage basiert auf einem Ansatz

How to find out what element is going to be extended, while registering my own in Polymer

und ein anderer auf Is it possible to share mixins across web components (and imports) in Polymer?

UPDATE 2

Ich habe einen Artikel geschrieben und kommt zu dem Schluss, meine Erfahrungen und Erkenntnisse über die Vererbung und Zusammensetzung mit Polymer: http://pascalprecht.github.io/2014/07/14/inheritance-and-composition-with-polymer/

+0

Ich fand einen anderen Ansatz hier: https://github.com/mvaldetaro/twbs-buttons. Der Autor dieses Projekts stellt eine API zur Verfügung, indem er ein "tag" -Attribut veröffentlicht, mit dem Sie das tatsächliche HTML-Tag angeben können, das verwendet werden soll. In der Webkomponenten-Implementierung sehen Sie, dass er nach verschiedenen Tag-Namen sucht und entsprechend unterschiedliche Vorlageninhalte verwendet. Definitiv * nicht * der Weg meiner Meinung nach. – PascalPrecht

Antwort

2

Wenn Sie nur einen einzigen Import haben, müssen die suppo hat rt für mehrere Elemente angewendet wird, Ihr Element könnte mehrere Elementdefinitionen enthalten, die nicht von Vorteil Polymer.mixin um begünstigt werden kann oder Funktionalität zwischen Ihre Dekoration Elemente zu teilen.

So pascal-decorator.html könnte Polymer Elementdefinitionen für <pascal-span> enthalten und <pascal-button>, von denen beide mixin Logik von einem Objekt innerhalb pascal-decorator.html definiert. Sie können dann <button is="pascal-button"> und <button is="pascal-span"> tun, während die Logik dafür im selben Import bleibt.

Die Alternative (wenn Sie das alles nur in einem benutzerdefinierten Element machen wollen, welches IMO dies weniger sauber macht) besteht darin, etwas gegen den Typ des Elements zu prüfen, das erweitert werden soll Sie linked to oder durch Überprüfung als Teil Ihrer Element Registrierung Prozess. Im Allgemeinen bevorzuge ich persönlich, herauszufinden, welche Logik ich möglicherweise zwischen Elementen, die dekoriert werden könnten, teilen muss, isoliere diese Funktionalität in ein Element und importiere sie dann in dedizierte Elemente, die Wissen über das Tag haben (zB <addy-button> , <addy-video> usw.).

+0

Addy, danke für deine ausführliche Antwort. Während ich die verschiedenen Möglichkeiten verstehe, mit diesem Szenario umzugehen, bin ich mir immer noch nicht sicher, ob das in bestimmten Fällen gewünscht ist. Ich denke die Twbs-Buttons sind ein perfektes Beispiel. Sie könnten Anker-Tags oder Schaltflächenelemente in Ihrer Anwendung haben, die wie ein Twitter-Button aussehen (und sich wahrscheinlich verhalten). Was Sie also haben wollen, ist, etw. Tun zu können. wie '

+0

Die Best Practices dafür entwickeln sich immer noch :) Es wäre hilfreich zu wissen, ob es ein konkretes Beispiel dafür gibt, was Sie erreichen möchten (mit welcher Funktionalität möchten Sie diese Elemente dekorieren?). Wenn es darum geht, das Verhalten (z. B. Interaktion/Klicken/Berühren) mit demselben Element zu erweitern, um die allgemeine Erweiterung zu unterstützen, sollte der Anwendungsfall funktionieren, ohne dass viel auf den Typ überprüft werden muss. Visuals sind, wo weitere Sorgfalt erforderlich ist, und das ist, wo ich bestimmte Elemente in Betracht ziehen würde, die benötigt werden. – addyo

+0

Nun, eigentlich habe ich genau das gleiche Szenario, das ich hier beschrieben habe. Ich versuche Web-Komponenten für das ionische Framework zu erstellen. Und es gibt eine Button-Komponente (natürlich ist es nur eine CSS-Klasse), die thematische Unterstützung usw. hat. Eigentlich geht es eigentlich nur um CSS, wo überhaupt kein benutzerdefiniertes Element benötigt wird, aber es könnte Situationen geben, in denen ich JS-Logik brauche Komponente wird mit einem '' Element verwendet. Ich dachte, es wäre vollkommen logisch, solche Fälle zu verwenden. – PascalPrecht

Verwandte Themen