从 scala.js 访问 JS

Access the JS this from scala.js

我需要实现来自 scala.js 的调用,方法如下:

sigma.classes.graph.addMethod('getNodesCount', function() {
  return this.nodesArray.length;
});

就是在JS中带库访问classsigma.clasess.graph的内部数组nodesArray的方式。我试过类似

trait GraphClassesJS extends js.Object {
  def addMethod(name:String,handler: js.Function0[Any]):Unit=js.native
}

我试着用

打电话
s.classes.graph.addMethod("getNodesCount",()=>js.ThisFunction.nodesArray.length)

但我得到

 value nodesArray is not a member of object scala.scalajs.js.ThisFunction
[error]     s.classes.graph.addMethod("getNodesCount",()=>js.ThisFunction.nodesArray.length)

我该怎么做? 谢谢 雷纳尔多

你误解了js.ThisFunction的本质。它不是 JS 中 this 的语法替代。它是将 this 作为显式参数的函数的替代类型层次结构。

你需要的定义和你写的差不多,只是把js.Function0换成了js.ThisFunction0,并且指定了Thing的类型,其中包含字段nodesArray(也许Graph?):

trait Thing extends js.Object {
  def nodesArray: js.Array[Node]
}

trait GraphClassesJS extends js.Object {
  def addMethod(name: String, handler: js.ThisFunction0[Thing, Any]): Unit = js.native
}

现在,您可以这样称呼它:

s.classes.graph.addMethod("getNodesCount", thiz => thiz.nodesArray.length)

现在 thiz 完全等同于 JS this。它的类型被推断为 Thing.