Как определить глобальную функцию JS в Kotlin? - PullRequest
0 голосов
/ 10 февраля 2019

Каждая функция и переменная, которую я создаю в проекте KotlinJs, попадает в модуль.Но мне нужно определить некоторые функции в глобальной области видимости.

Я использую библиотеку p5js (pure js).Это позволяет пользователю определять функции обработки событий в глобальной области видимости.Я пытаюсь использовать KotlinJS в этом проекте.Но я не знаю, как создавать глобальные функции для обработки событий p5js.Все мои функции Kotlin находятся внутри модуля.И чтобы вызвать мой код Kotlin, мне нужно указать полное имя mymodule.draw()

. В настоящее время я должен сделать дополнительный слой чистого кода JS с глобальными функциями, которые переводят выполнение в функции Kotlin, который выглядит следующим образом:

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

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

Проблема этого подхода заключается в большом количестве шаблонного и повторяющегося кода.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

К сожалению, нет способа определить глобальную функцию в Kotlin / JS.Можно использовать простой тип модуля, где у вас есть глобальные символы в объекте модуля, который определен в глобальной области видимости.

// module M
fun foo() {}

, который доступен через M.foo

0 голосов
/ 10 марта 2019

Добавляя поверх ответа Сергея, можно также использовать эту работу при работе с библиотеками вроде p5.js

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

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

Этот подход минимизирует определение и объявление двух функций (глядя наВы C язык).Спасибо

0 голосов
/ 10 февраля 2019

В случае, если это кому-то будет полезно, я оставлю здесь еще один обходной путь:

import kotlin.browser.window

fun main() {
    window.asDynamic()["setup"] = ::setup
    window.asDynamic()["draw"] = ::draw
}

fun setup() {}
fun draw() {}

Что он на самом деле делает, он создает функции в модуле kotlin как обычно, а затем назначает их объекту окна, что делаетit global.

Это решение все еще не идеально, потому что для каждой функции требуется ручное назначение.По крайней мере, он делает это правильно в проекте Kotlin, нет необходимости поддерживать отдельный чистый файл js.Возможно, можно создать аннотацию и использовать отражение kotlin (понятия не имею, как оно поддерживается в KotlinJS).

Хотя это решение работает для меня, я хотел бы иметь какое-то готовое решение, как для@JsNonModule external функций.

...