【发布时间】:2016-09-03 15:36:48
【问题描述】:
请注意,这不是一个简单的 JS 问题。我真的需要 ScalaJS 的帮助。
几天来,我一直在尝试绘制一个简单的连接树图。它可以嵌套任意深度。我在这个文件中读到:
{
"name": "Animal",
"children": [
{
"name": "Vertebrates",
"children": [
{
"name": "Mammals"
},
{
"name": "Birds"
}
]
},
{
"name": "Invertebrates"
}
]
}
当我运行这个程序时:
package example
import scala.scalajs.js
import org.singlespaced.d3js.{Link, Tree, d3}
@js.native
trait AnimalNode extends js.Object {
val name: String = js.native
val children: js.Array[AnimalNode] = js.native
}
object ScalaJSExample extends js.JSApp {
def main(): Unit =
d3.json("json-example.json", (error: js.Any, json: js.Any) => {
val jsonTypedFromFile = json.asInstanceOf[AnimalNode]
val width = 960.0
val height = 500.0
val tree: Tree[AnimalNode] = d3.layout.tree().size((width, height))
val nodes = tree.nodes(jsonTypedFromFile)
val links = tree.links(nodes)
val svg = d3.select("#tree").append("svg")
.attr("width", width).attr("height", height).append("g")
val diagonal = d3.svg.diagonal() //Want to draw Diagonals across all links.
svg.data(links)
.append("path")
.attr("class", "link")
.style("stroke-width", 5)
.attr("d", (myJson: Link[AnimalNode], x: Int, y: js.UndefOr[Int]) => {
??? // TODO: Draw Diagonal between source & target. Never reached.
})
println("Finished drawing paths.")
})
}
我在 Firebug 中收到此错误:
uncaught exception:
scala.scalajs.runtime.UndefinedBehaviorError:
An undefined behavior was detected:
[object Object] is not an instance of org.singlespaced.d3js.Link
我可能需要针对的另一个签名是:
.attr("d", (myJson: Link[Node], x: Int, y: js.UndefOr[Int]) => { ... }
我的代码是 ScalaJSD3 示例应用程序的一个分支,可在此处获得:https://github.com/swoogles/scala-js-d3-example-app
它的灵感来自这里的纯 Javascript 代码:http://bl.ocks.org/d3noob/8375092
【问题讨论】:
-
这里有很多代码。你能把它最小化到导致错误出现所需的位吗?这通常是调试像这样神秘的东西的第一步......
-
@JustinduCoeur 我包括了两次尝试,因为我不确定哪个更接近正确答案。我很乐意减少它,但我应该删除 Dynamic 选项还是 AnimalNode 选项?
-
没关系——无情地把它删掉,直到你只需要说明“我认为这应该有效,但它给出了一个错误”,用绝对 no 额外的行。将数据结构切割成裸露的骨头,将其切割成一条路径,切割,切割,切割。这是最小化错误的核心,并且通常是为了引起任何人的注意而必需的。 (而且很多时候,这样做的过程会揭示问题所在。)
-
很好的建议。我大幅削减了它,但问题仍然存在。
-
我刚刚通过有向图示例将代码发布到 github 大声笑。 github.com/jshin47/jt