gpt4 book ai didi

polymer - scala.js 中真正的 JS 类来开发 webcomponents

转载 作者:行者123 更新时间:2023-12-04 12:51:56 31 4
gpt4 key购买 nike

我想使用 scala.js 在 Polymer 2.0 项目中开发一些 webcomponents。虽然有 wonderful demo-project on github演示它如何与 Polymer 1.0 配合使用。我无法获得与使用 Polymer 2.0 和 native 元素注册技术类似的东西。

一个简单的外观可能如下所示

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

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

实际元素:
@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

}

不管我是否走老式元素注册 Polymer(MyElement)或平台原生变体 window.customElement.define(MyElement.is, MyElement)它显然抛出了一个异常 MyElement不能用 new MyElement 固定.
它抛出异常:
Uncaught TypeError: Class constructor PolymerElement cannot be invoked without 'new'

学习 Scala.js facade writing guide ,我已经尝试了很多外观变体声明 PolymerElementPolymerBase抽象的。

我想到的一个可能的解决方案是,编写一个原生 JavaScript 类,它确实可以实例化并使用 @js.native他们的外墙。但我正在寻找一种使用 Scala.js 0.6.16 提供的东西来实现它的方法。

最佳答案

更新版本 (2018-04)

好的,这可能对其他人也有帮助,我决定发布我的新版本。

我正在使用这个纯 ScalaJS 解决方案与 Polymer2/CustomElements 集成。

我的环境是:

  • 斯卡拉:2.12
  • ScalaJS:0.6.22
  • 还有:"org.scala-js" %%% "scalajs-dom" % "0.9.2"

  • ScalaJS 选项:
    "-P:scalajs:sjsDefinedByDefault"
    我为 CustomElements 和 Polymer 2 创建了一些 ScalaJS 外观并在此处发布 - https://bitbucket.org/latestbit/scalymer/src/tip/src/main/scala/org/latestbit/sjs/polymer2/?at=default

    它们不是功能齐全的 polymer 外墙,只是处于最开始的状态,但它们正在为我工​​作。

    您可以轻松使用它们,而无需任何技巧,例如:

    @JSExportTopLevel(name = "TestElement")
    class TestElement() extends Polymer.Element {

    override def connectedCallback(): Unit = {
    super.connectedCallback()
    global.console.log(s"Attribute name ${getAttribute("name")}. Body is ${dom.document.querySelector("body")}")
    global.console.log(s"${this.$.selectDynamic("testCl")}")
    global.console.log(s"${$$("testCl")}")
    }
    }


    object TestElement {
    @JSExportStatic
    def is = "test-element"

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

    然后也在 Scala 中注册它,例如:

    object TestJsApplication {

    def main() : Unit = {
    Globals.customElements.define(TestElement.is,
    js.constructorOf[TestElement]
    )
    }

    }

    html 部分是常见的:
    <dom-module id="test-element">

    <template>
    <span id="testCl">Not much here yet.</span>
    This is <b>[[name]]</b>.
    </template>

    </dom-module>

    您将在此处找到完整的示例 - https://bitbucket.org/latestbit/scalymer/src

    一个古老的尝试解决(出于历史目的)

    好的,这是我找到的最好的“解决方案”。

    这并没有完全解决它,但我希望这将是一个有用的技巧,同时我们期待 sjs 在这方面的改进。
  • 获取任何库以“混合”js 类。我用过 https://github.com/rse/aggregation .
  • 创建您的 ScalaJS 组件,但不要尝试直接从 Polymer.Element 继承它:

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

    object TestPolymerElement {
    @JSExportStatic
    def is = "test-polymer-element"
    }
  • 创建一个JS纯“伴侣”类继承Polymer.Element和ScalaJS组件作为mixin并注册:
  • class TestPolymerElementJs extends aggregation(Polymer.Element,TestPolymerElement) {
    }
    customElements.define(TestPolymerElementJs.is, TestPolymerElementJs);

    此外,您可以在 ScalaJS 中定义属性并管理它们,例如:

    @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"
    )
    )
    }

    关于polymer - scala.js 中真正的 JS 类来开发 webcomponents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975854/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com