我想用 scala.js 在 Polymer 2.0 项目中开发一些 web 组件。虽然github 上有一个精彩的演示项目,展示了它如何与 Polymer 1.0 一起使用。我无法获得与 Polymer 2.0 和本机元素注册技术类似的东西。
一个简单的外观可能如下所示
@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 外观编写指南,我已经尝试了很多外观变体声明PolymerElement
和PolymerBase
抽象。
我想到的一个可能的解决方案是,编写一个本机 JavaScript 类,它确实是可实例化的,并@js.native
在它们上使用外观。但我正在寻找一种使用Scala.js 0.6.16提供的东西来实现它的方法。