Google visualization 动态使用会导致递归无限的数据结构
我正在尝试使用来自。我使用生成了类型定义,它生成的相关部分是:Google visualization 动态使用会导致递归无限的数据结构,google-visualization,scala.js,Google Visualization,Scala.js,我正在尝试使用来自。我使用生成了类型定义,它生成的相关部分是: @js.native trait ColumnChartOptions extends js.Object { var aggregationTarget: String = js.native var animation: TransitionAnimation = js.native var annotations: ChartAnnotations = js.native // ... more } @js.
@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对象,还有其他建议吗?我尝试了newcolumnChartOptions{}
,它看起来比js.Dynamic
更干净,但是失败了,因为“Scala.js定义的js类不能直接扩展原生js特性。”
另外,我想指出
options.animation = js.Dynamic.literal(
easing = "inAndOut",
startup = true,
duration = 2000
).asInstanceOf[TransitionAnimation]
实际上可以工作,但不是类型安全的(不会发现duration
到duration
的拼写错误)。调用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
是单例对象literal
,而literal()
调用所述对象的方法apply()
。谢谢,这确实有帮助。