DukeScript: Как работают нативные вызовы в JavaScript?

Я пытаюсь понять, как работают вызовы "нативных методов" в DukeScript. В частности, те, в которых тело не указано в аннотации @JavascriptBody. Например:

@JavaScriptResource(value = "userEntryComponent.js")
public final class UserEntryWidget {

    private UserEntryWidget() {
    }

    @JavaScriptBody(args = {}, body = "")
    public static native void registerComponent();
}

Где определен метод registerComponent()? В нокауте есть функция javascript под названием "ko.components.register". Поэтому "registerComponent" должен быть своего рода оболочкой вокруг "ko.components.register".

Другой пример вызова нативного метода без тела приведен здесь:

@JavaScriptResource("jquery-1.11.0.min.js")
public class JQuery {

    @JavaScriptBody(args = {},body="")
    public static native void init();   
}

Итак, что в этом случае означает "init()"? это метод Java или функция JavaScript?

1 ответ

Решение

Я полностью понимаю, почему код выглядит волшебным. Однако, если вы попытаетесь закомментировать метод init, вы должны увидеть ошибку во время усложнения javac:

COMPILATION ERROR : 
-------------------------------------------------------------
JQuery.java:[10,8] At least one method needs @JavaScriptBody
annotation. Otherwise it is not guaranteed the resource will
ever be loaded

Строка ошибки - это строка с использованием @JavaScriptResource. Определение метода init действительно пустое и ничего не делает. Но после вызова он обеспечивает загрузку ресурса, определенного в @JavaScriptResource.

В случае выбивки ko.components.register определяется файлом ресурсов knockout.js. Имя метода registerComponent может быть произвольным, оно служит для запуска загрузки ресурса knockout.js.

Другие вопросы по тегам