我试图使用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
包含对自身的引用,但我觉得这不应该基于上面的代码发生。
想法如何解决?
有关如何最好地使用生成的类型提供类型安全的方法来创建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]
实际上有效,但不是类型安全的(错误拼写duration
到durration
不会被抓住)。
答案 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()
。