【问题标题】:Scala.js: export class constructor with parameters to javascriptScala.js:将带参数的类构造函数导出到javascript
【发布时间】:2016-08-02 08:33:37
【问题描述】:

学习 scala.js 并尝试将 scala.js 类导出到 javascript,如下所示:

@JSExport("Pt")
class Pt[T]( points: Seq[T] ) {

    @JSExport
    def y = points(1)
}

当我在 javascript 控制台 (Chrome) 中尝试此操作时:

new Pt([1,2,3])

上面抛出一个错误:"$c_sjsr_UndefinedBehaviorError ... 1,2,3 is not an instance of scala.collection.immutable.Seq"。不知道如何在 javascript 中将 Seq 作为参数传递。

创建一个带参数的类构造函数有什么诀窍,这样它就可以作为 javascript 库和 scala 库工作?我必须使用 js.Array 吗? (如果可能,更喜欢不可变集合)

我尝试了@JSExportAll,但它也不起作用:

@JSExportAll
class Pt[T]( points: Seq[T] ) {
    def y = points(1)
}

然后在 javascript 控制台 (Chrome) 中,我什至找不到构造函数。它抛出 "ReferenceError: Pt is not defined"

【问题讨论】:

  • 我认为你必须导出的是js.Array[T],在你的类中然后它可以用作Seq[T](可能你需要wrap它。)对于构造函数,你可能是对this page感兴趣。
  • 是的,我同意这可能就是正在发生的事情。请记住,在 JavaScript API 中,Scala 代码必须使用 JS 类型来描述事物,因为 JavaScript 对 Scala 类型一无所知。因此,您传入可变的js.Array,然后将其转换为不可变的Seq,以便在Scala 代码中使用...

标签: scala scala.js


【解决方案1】:

你有几个选择:

在任何地方使用js.Array

@JSExport
class Pt[T](points: js.Array[T]) {
  def y = points(1)
}

// Scala
val pt = new Pt(js.Array(1,2,3))

// JS
var pt = new Pt([1,2,3])

创建一个接受js.Array 的辅助构造函数

class Pt[T](points: Seq[T]) {
  @JSExport
  def this(points: js.Array[T]) = this(points.toSeq)

  def y = points(1)
}

// Scala
val pt = new Pt(Seq(1,2,3))

// JS
var pt = new Pt([1,2,3])

在构造函数中取一个变量参数列表

@JSExport
class Pt[T](points: T*) {
  def y = points(1)
}

// Scala
val pt1 = new Pt(1,2,3)
val pt2 = new Pt(seq: _*)

// JS
var pt = new Pt(1,2,3)

【讨论】:

  • 谢谢!这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2013-11-07
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多