如何在Kotlin中定义全局js函数?

问题描述 投票:5回答:3

我在KotlinJs项目中创建的每个函数和变量都进入了一个模块。但我需要在全球范围内定义一些功能。

我使用p5js库(纯js)。它允许用户在全局范围内定义事件处理函数。我正在尝试在这个项目中使用KotlinJS。但我不知道如何创建全局函数来处理p5js的事件。我所有的Kotlin函数都在模块内部。要调用我的Kotlin代码,我需要指定全名mymodule.draw()

目前,我必须使用全局函数创建一个额外的纯JS代码层,将执行转换为kotlin函数,如下所示:

function setup() {
    mymodule.setup();
}

function draw() {
    mymodule.draw();
}

这种方法的问题是很多样板和重复代码。

javascript kotlin global-variables kotlin-js-interop kotlin-js
3个回答
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
投票

遗憾的是,没有办法在Kotlin / JS中定义全局函数。可以使用Plain模块类型,其中您在模块对象中具有全局范围中定义的全局符号。

// module M
fun foo() {}

可以通过M.foo访问


1
投票

除了@ Sergey的答案之外,在处理像p5.js这样的库时,也可以使用这个工作

fun main() {
    window.asDynamic().setup = {
        // your setup code here
    }

    window.asDynamic().draw = {
        // your draw code here
    }
}

这种方法最小化了两个函数的定义和声明(看着你的C语言)。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.