2017-05-15 2 views
6

Ich möchte einige der Webkomponenten in einem Polymer 2.0-Projekt mit scala.js entwickeln. Während es eine wonderful demo-project on github zeigt, wie es mit Polymer 1.0 funktioniert. Ich kann nichts Ähnliches mit der Arbeit mit Polymer 2.0 und der nativen Element-Registrierungstechnik bekommen.echte JS-Klassen in scala.js zur Entwicklung von Webkomponenten

Es window.customElement.define(MyElement.is, MyElement) offensichtlich
@JSExportTopLevel("MyElement") 
@ScalaJSDefined 
class MyElement extends PolymerElement { 

    private var label = "init" 

    override def is = "my-element" 

    override def properties = js.Dynamic.literal(
    "label" -> Map(
     "type" -> "String", 
     "value" -> "init", 
     "notify" -> true 
    ).toJSDictionary 
) 

    def testMe = { 
    println(label) 
    } 
} 

object MyElement { 
    @JSExportStatic 
    val is: String = MyElement.is 

    @JSExportStatic 
    val properties: js.Dynamic = MyElement.properties 

} 

Egal ob ich nehme den alten Stil Element Registrierung Polymer(MyElement) oder die Plattform nativen Variante:

Eine einfache Fassade wie folgt

@ScalaJSDefined 
class PolymerElement extends PolymerBase { 
    def is: String = "" 
    def properties: js.Dynamic = js.Dynamic.literal() 
} 

@js.native 
@JSGlobal("Polymer.Element") 
class PolymerBase extends HTMLElement 

Die tatsächliche Element aussehen könnte löst eine Ausnahme aus, da MyElement nicht mit new MyElement unveränderbar ist. Es wirft die Ausnahme:

Uncaught TypeError: Class constructor PolymerElement cannot be invoked without 'new' 

die Scala.js facade writing guide Studium, ich habe bereits versucht, eine Menge Fassadenvarianten PolymerElement und PolymerBaseabstrakte erklärt.

Eine mögliche Lösung, die mir in den Sinn kommt, ist das Schreiben einer nativen JavaScript-Klasse, die tatsächlich instanziierbar ist und @js.native Fassaden auf ihnen verwendet. Aber ich suche nach einem Weg, um es mit etwas zu erreichen Scala.js 0.6.16 bietet.

+0

Bump in diese auch. Haben Sie eine Lösung dafür gefunden? – abdolence

+0

Nicht wirklich, ich verwarf die Idee, alles in scala.js zu tun, so dass das Elementskelett normal JS bleibt und die relevanten Hilfsfunktionen in scala.js geschrieben sind ... Mir wurde gesagt, dass ES6-Unterstützung für die Übertragung kommt in v. 1.0 von scala.js bald ... Ich freue mich schon darauf – SeDav

+0

@SeDev ich sehe. Vor dem hatte ich Angst. Wie auch immer, danke für Hilfe! – abdolence

Antwort

1

Ok, das ist die beste 'Lösung', die ich gefunden habe.

Dies löst es nicht vollständig, aber ich hoffe, es wird ein hilfreicher Trick sein, während wir sjs Verbesserungen in diesem Bereich erwarten.

  1. Holen Sie sich eine Bibliothek, um Klassen zu mischen. Ich habe https://github.com/rse/aggregation verwendet.

  2. Erstellen Sie Ihre ScalaJS Komponente aber nicht versuchen, es direkt von Polymer.Element zu erben:

@ScalaJSDefined 
@JSExportTopLevel("TestPolymerElement") 
class TestPolymerElement extends js.Object { 
    def test = g.console.log("Hello from scala") 
} 

object TestPolymerElement { 
    @JSExportStatic 
    def is = "test-polymer-element" 
} 
  1. erstellen JS reine "Begleiter" -Klasse Polymer.Element und ScalaJS Komponente als mixin und registrieren Sie es erben:
class TestPolymerElementJs extends aggregation(Polymer.Element,TestPolymerElement) { 
} 
customElements.define(TestPolymerElementJs.is, TestPolymerElementJs); 

auch können Sie die Eigenschaften definieren eine nd managen sie in ScalaJS wie:

@ScalaJSDefined 
@JSExportTopLevel("TestPolymerElement") 
class TestPolymerElement(val name : String) extends js.Object { 

    def test = g.console.log(s"Hello from ${name}") 

} 

object TestPolymerElement { 
    @JSExportStatic 
    def is = "test-polymer-element" 

    @JSExportStatic 
    def properties = js.Dictionary (
     "name" -> js.Dictionary(
      "type" -> "String" 
     ) 
    ) 
} 
+0

Ich habe es versucht, und es hat nicht richtig funktioniert.Obwohl es "kompiliert" wurde und das Projekt lief, bekam ich Fehler, während ich versuchte, von der Klasse auf öffentliche Member-Vals zuzugreifen, nur (statische) Objektfelder verfügbar waren, ein Beispielprojekt als Spielplatz hochladen, vielleicht ist es jemand anderes möglich repariere es – SeDav