Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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
Javascript 在ScalaJS中将DOM元素传递给第三方类构造函数失败_Javascript_Html_Scala.js - Fatal编程技术网

Javascript 在ScalaJS中将DOM元素传递给第三方类构造函数失败

Javascript 在ScalaJS中将DOM元素传递给第三方类构造函数失败,javascript,html,scala.js,Javascript,Html,Scala.js,在这个简单的网页中,我尝试创建一个网格: 解决方案1是纯JavaScript实现,可以很好地工作: const-config={ 数据:[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ], 行标题:对, colHeaders:是的, 许可证密钥:“非商业和评估” } window.addEventListener('load',ev=>{ 常量元素=document.getElementById('grid-viewer'); const grid=新的Handsonta

在这个简单的网页中,我尝试创建一个网格:


解决方案1是纯JavaScript实现,可以很好地工作:

const-config={
数据:[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
],
行标题:对,
colHeaders:是的,
许可证密钥:“非商业和评估”
}
window.addEventListener('load',ev=>{
常量元素=document.getElementById('grid-viewer');
const grid=新的Handsontable(元素,配置);
console.log(元素);//打印。。。
console.log(config);//打印对象{…}
});
解决方案2是一个Scala.js实现,它是上面代码的直译,为第三方库添加了façade(Handsontable将其构造函数存储在window对象中):

包示例
导入org.scalajs.dom
导入scala.scalajs.js
导入scala.scalajs.js.annotation.JSGlobal
@js.native
@JSGlobal(“可手持”)
类Handsontable(元素:dom.raw.element,conf:js.Object)扩展了js.Object
对象示例{
def main(参数:数组[字符串]):单位={
对象配置扩展了js.object{
val数据=列表(
清单(1,2,3),
清单(4,5,6),
名单(7、8、9)
)
val rowHeaders=true
val colHeaders=true
val licenseKey=“非商业和评估”
}
addEventListener(“加载”,{ev:dom.Event=>
val元素=dom.document.getElementById(“网格查看器”)
val grid=新的可手持设备(元素,配置)
println(元素)//打印[object htmldevelment]
println(config)//打印[对象]
})
}
}
Scala.js解决方案调用构造函数,但随后由于
TypeError:element未定义而失败。
println
调用的输出使我相信
element
不是元素本身,而是一个包装器

这是我的sbt配置:

enablePlugins(ScalaJSPlugin)//1.3.1
enablePlugins(ScalaJSBundlerPlugin)//0.20.0
规模规避:=“2.13.4”
scalaJSUseMainModuleInitializer:=真
libraryDependencies+=“org.scala js”%%“scalajs dom”%%“1.1.0”

为什么我的Scala.js程序的行为与等效的js程序不同?我的façade定义正确吗?

您的示例中唯一出现错误的地方是如何将
数据
传递到配置:
列表
是对JavaScript代码不透明(即无意义)的Scala类型。相反,您需要使用
js.Array

val data=js.Array(
js.Array(1,2,3),
js.Array(4,5,6),
js.Array(7,8,9)
)

很难说这是否是问题的根源,因为错误消息没有上下文。

>println调用的输出使我相信元素不是元素本身,而是包装器。这只是因为
console.log
/
println
以不同的方式将HTML元素转换为字符串!只需切换到
js.Array
即可解决问题。谢谢