Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google visualization 动态使用会导致递归无限的数据结构_Google Visualization_Scala.js - Fatal编程技术网

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()

谢谢,这确实有帮助。