Scala.js js.Dynamic用法导致递归无限的数据结构

时间:2016-01-02 08:12:09

标签: google-visualization scala.js

我试图使用Google Visualizations中的Scala.js。我使用TS importer生成了类型定义,它生成的相关部分是:

@js.native
trait ColumnChartOptions extends js.Object {
  var aggregationTarget: String = js.native
  var animation: TransitionAnimation = js.native
  var annotations: ChartAnnotations = js.native
  // ... more
}

@js.native
trait TransitionAnimation extends js.Object {
  var duration: Double = js.native
  var easing: String = js.native
  var startup: Boolean = js.native
}

现在,我试图弄清楚如何实际使用它并提出:

val options = js.Dynamic.literal.asInstanceOf[ColumnChartOptions]
options.animation = js.Dynamic.literal.asInstanceOf[TransitionAnimation] // comment this and the next line and chart will appear
options.animation.duration = 2000
options.title = "Test Chart"
options.width = 400
options.height = 300

如果我没有设置动画设置,则会有效,但是图表显示"超出最大调用堆栈大小"如果我做。

我调试了,发现了以下内容: animation contains a reference to itself

所以animation包含对自身的引用,但我觉得这不应该基于上面的代码发生。

想法如何解决?

有关如何最好地使用生成的类型提供类型安全的方法来创建Google Visualizations所期望的JavaScript对象的任何其他建议?我尝试new ColumnChartOptions {}看起来比js.Dynamic更清晰,但是失败了" Scala.js定义的JS类无法直接扩展本机JS特性。"

P.S。我要注意

options.animation = js.Dynamic.literal(
  easing = "inAndOut",
  startup = true,
  duration = 2000
).asInstanceOf[TransitionAnimation]

实际上有效,但不是类型安全的(错误拼写durationdurration不会被抓住)。

1 个答案:

答案 0 :(得分:2)

调用()时,您的代码缺少literal(),因此修复程序将为:

val options = js.Dynamic.literal().asInstanceOf[ColumnChartOptions]
options.animation = js.Dynamic.literal().asInstanceOf[TransitionAnimation] // comment this and the next line and chart will appear

在Scala中(因此在Scala.js中)()的存在与否有时是有意义的。 literal是单身object literal,而literal()则调用所述对象的方法apply()