Scalajs, js.Dictionary 不一致的行为

Posted

技术标签:

【中文标题】Scalajs, js.Dictionary 不一致的行为【英文标题】:Scalajs, js.Dictionary inconsistent behavior 【发布时间】:2021-12-27 12:49:59 【问题描述】:

我在使用 ScalaJS 时遇到了一个不一致的错误。这是一个最小的例子:字典变量的大小和内容不一致。


def A(mapping: js.Dictionary[String]): Unit = 
  dom.console.log(mapping)
  dom.console.log(mapping.size)

我使用 fastOptJS 链接 IR。在 html 的驱动程序代码中,我有

const colorSetting = new Map([
        ["1", "black"]
]);
ScalaJSExample.A(colorSetting)

在控制台中,第一行正确打印了变量的内容,

"Map "1" => "black""

但是第二行打印的是0。我也试过交换两行的位置,但是结果是一样的。 .foreach 或 for (x

有什么建议为什么会这样?我正在使用 Scala 2.12.8、ScalaJS 1.7.1。

谢谢!

【问题讨论】:

【参考方案1】:

js.Dictionary 代表一个 POJO(普通的旧 javascript 对象),其中元素是字段。但是您将 JS new Map() 传递给它,这不是 POJO——它是 Map。表示 JS Map 的正确类型是 js.Map

要么将字典传递给ScalaJSExample.A,如下所示:

const colorSetting = 
    "1": "black"
;
ScalaJSExample.A(colorSetting)

或在 Scala.js 代码中将 mapping 声明为 js.Map

def A(mapping: js.Map[String, String]): Unit = 
  dom.console.log(mapping)
  dom.console.log(mapping.size)

【讨论】:

以上是关于Scalajs, js.Dictionary 不一致的行为的主要内容,如果未能解决你的问题,请参考以下文章

scalajs_初体验

scalajs-react:处理 ajax 响应的惯用方式

scalajs-react:Ajax GET 与 DELETE 的意外差异

Scalajs-react:未捕获的 TypeError:无法读取 null 的属性(读取“值”)

scalajs-react:如何从状态对象的 Seq 中获得多行文本字段?

如何在 ScalaJS build.sbt 中设置 mainClass?