Использование GWT JSNI для интеграции с файлами js

В настоящее время я работаю над проектом GWT, и теперь он должен использоваться внешним файлом JavaScript. Сейчас я создаю тестовый прототип, чтобы убедиться, что обе стороны работают правильно.

Когда я запускаю и компилирую, я вижу журналы консоли в браузере из вызываемых событий. Однако Java-методы GWT не вызываются.

Перепробовав множество сценариев, я также заметил, что если я удаляю оболочку $entry из exportStaticMethods(), происходит обратное. Я вижу, что System.out вызывается в моем Java-коде, однако журналы консоли из JavaScript в браузере не вызываются.

Я пытаюсь понять, что вызывает такое поведение, и есть ли небольшой недостающий элемент, который я упустил из виду.

Я уже просмотрел документацию GWT JSNI для вызова метода Java из js и попытался найти решение других связанных вопросов на StackOverflow.

GWT и Java

Я перешел к методу onModuleLoad() моего класса EntryPoint и добавил статический метод с именем exportStaticMethods(). Я также создал файл PokePingClass.java, указанный ниже.

EntryPointClass.java

public class EntryPointClass implements EntryPoint {

    @Override public void onModuleLoad() {
        exportStaticMethods();
        // load application here.
    }

    public static native void exportStaticMethods() /*-{

        $wnd.pingApp = $entry((function) {
                           @com.application.PokePingClass::pingApp()();
                       });

        $wnd.pokeApp = $entry((function) {
                           @com.application.PokePingClass::pokeApp()();
                       });
    }-*/
}

PokePingClass.java

public class PokePingClass {

    public static void pokeApp() {
        System.out.println("pokeApp() called");
    }

    public static void pingApp() {
        System.out.println("pingApp() called");
    }
}

HTML и js

В файле .html проекта я добавил скрытый элемент div id 'pokePing', а также файл pokeping.js.

<html>
    <head>
        .
        . <!-- other stuff -->
        .
        <script type='text/javascript' src='pokeping.js</script> 
    </head>

    <body>
        .
        . <!-- other stuff -->
        .
        <div id="pokePing" style="visibility: hidden;"></div>
    </body>
</html>

pokeping.js

$(document).ready(function) {

    var $pp = $('#pokePing');

    var pokeApp = function() {
        console.log("app handling poke event");
        window.parent.pokeApp();
    }

    var pingApp = function() {
        console.log("app handling ping event");
        window.parent.pingApp();
    }

    $pp.trigger('pokeApp');
    $pp.trigger('pingApp');
}

person JEberhardt    schedule 04.01.2017    source источник


Ответы (2)


public static native void exportStaticMethods() /*-{

    $wnd.pingApp = $entry(function) {
                       @com.application.PokePingClass.pingApp()();
                   }

    $wnd.pokeApp = $entry(function) {
                       @com.application.PokePingClass.pokeApp()();
                   }
}-*/

Это недопустимый JS и не имеет смысла как JSNI. Попробуйте это вместо этого:

    $wnd.pingApp = $entry(function() {
                       @com.application.PokePingClass::pingApp()();
                   });

    $wnd.pokeApp = $entry(function() {
                       @com.application.PokePingClass::pokeApp()();
                   });

Отредактируйте, потому что я все еще ошибался, забыл оператор :: для участников.

person Colin Alworth    schedule 04.01.2017
comment
Извинения. Я исправил синтаксис JSNI для функций. Я все еще наблюдаю те же проблемы. Я забыл отметить, что я также использую jquery-2.2.4.min.js. В настоящее время он не работает в режиме отсутствия конфликтов, если это помогает. Этот вопрос также упоминается на форумах SmartGWT, поскольку я также использую эту структуру. - person JEberhardt; 09.01.2017
comment
Кроме того, что методы не вызываются, в консоли вашего браузера нет других ошибок? Вы уверены, что System.out делает то, что, по вашему мнению, делает в браузере? - person Colin Alworth; 09.01.2017
comment
Извините за поздний ответ. Я нашел аналогичный ответ на SO. Я не могу найти OP, но предоставлю ссылку, когда найду его. По какой-то причине, когда я добавляю возврат к функциям JSNI, кажется, что он работает, и я вижу операторы System.out. - person JEberhardt; 17.02.2017

Я нашел аналогичный пост, но ключ был в том, чтобы фактически вернуть вызовы методов в функциях JSNI. После этого все работает хорошо.

public static native void exportStaticMethods() /*-{

    $wnd.pingApp = $entry((function) {
                       return @com.application.PokePingClass::pingApp()();
                   });

    $wnd.pokeApp = $entry((function) {
                       return @com.application.PokePingClass::pokeApp()();
                   });
}-*/
person JEberhardt    schedule 17.02.2017