我在KotlinJs项目中创建的每个函数和变量都进入一个模块。但是我需要在全局范围内定义一些功能。
我使用p5js库(纯js)。它允许用户在全局范围内定义事件处理功能。我正在尝试在此项目中使用KotlinJS。但是我不知道如何创建全局函数来处理p5js的事件。我所有的Kotlin功能都在模块内部。要调用我的Kotlin代码,我需要指定全名mymodule.draw()
当前,我必须使用全局函数制作一个额外的纯JS代码层,以将执行转换为如下所示的kotlin函数:
function setup() {
mymodule.setup();
}
function draw() {
mymodule.draw();
}
这种方法的问题是很多样板和重复的代码。
答案 0 :(得分:3)
如果这对某人有用,我将在这里留下另一个解决方法:
import kotlin.browser.window
fun main() {
window.asDynamic()["setup"] = ::setup
window.asDynamic()["draw"] = ::draw
}
fun setup() {}
fun draw() {}
实际上,它像往常一样在kotlin模块中创建函数,然后将其分配给window对象,这使其成为全局对象。
该解决方案仍然不是理想的,因为它需要为每个功能手动分配。至少它在Kotlin项目中做到了正确,无需维护单独的纯js文件。 也许可以创建一个注释并利用kotlin反射(不知道KotlinJS如何支持它)。
尽管此解决方案对我有用,但我想像@JsNonModule external
函数一样使用一些开箱即用的解决方案。
答案 1 :(得分:1)
不幸的是,在Kotlin / JS中无法定义全局函数。如果在全局范围内定义的模块对象中具有全局符号,则可以使用普通模块类型。
// module M
fun foo() {}
可通过M.foo
答案 2 :(得分:1)
除了@Sergey的答案之外,在处理诸如p5.js之类的库时,也可以使用此解决方法
fun main() {
window.asDynamic().setup = {
// your setup code here
}
window.asDynamic().draw = {
// your draw code here
}
}
这种方法最小化了两个函数的定义和声明(从您的C语言着眼)。谢谢