Как объявить JavaScript класс "google.visualization.AreaChart" в Kotlin? - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь объявить код JavaScript для класса, определенного точечной нотацией:

var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));

Я пробовал разные подходы, но ничего не работает правильно.Например:

external class Google {
    val visualization: Visualization
    class Visualization {
        class AreaChart(element: Element?) {
            fun draw(chartDataTable: dynamic, options: dynamic)
        }
    }
}

external val google: Google

val chart = Google.Visualization.AreaChart(document.getElementById('chart_div'))

от Kotlin никогда не переводится правильно.

Мне нужно

var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));

, но я становлюсь недействительным:

  var Google$Visualization$AreaChart = Google.Visualization.AreaChart;
  var chart = new Google$Visualization$AreaChart(document.getElementById('chart_div'));

1 Ответ

0 голосов
/ 05 апреля 2019

Для этого можно использовать аннотацию Kotlin JsQualifier.

Поместите AreaChart в отдельный файл и пометьте файл @file:JsQualifier("google.visualization"):

@file:JsQualifier("google.visualization")

import org.w3c.dom.Element

external class AreaChart(element: Element?) {
    fun draw(chartDataTable: dynamic, options: dynamic)
}

Затем создайте новый объект класса AreaChart как обычно:

val chart = AreaChart(document.getElementById("chart_div"));

Котлин компилирует это в:

var AreaChart = google.visualization.AreaChart;
var chart;
Object.defineProperty(_, 'chart', {
    get: function () {
        return chart;
    }
});
chart = new AreaChart(document.getElementById('chart_div'));

К сожалению, существует проблема в компиляторе Kotlin JS, которая не позволяет совместной работе Google Charts работать с кодом, созданным Kotlin.

Обходной путь для этого описан в https://discuss.kotlinlang.org/t/problem-with-declarations-added-by-kotlin-js/7177/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...