2017-01-04 17 views
2

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

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

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

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

Я уже рассмотрел документацию GWT JSNI для calling a Java method from 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 элемент с идентификатором ' 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'); 
} 

ответ

0

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

public static native void exportStaticMethods() /*-{ 

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

    $wnd.pokeApp = $entry((function) { 
         return @com.application.PokePingClass::pokeApp()(); 
        }); 
}-*/ 
3
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()(); 
        }); 

Edit, потому что я до сих пор это не так, забыл :: оператор для членов.

+0

Извинения. Я исправил синтаксис JSNI для функций. Я все еще наблюдаю одни и те же проблемы. Я забыл отметить, что я использую jquery-2.2.4.min.js. В настоящее время он не работает в режиме конфликтов, если это помогает. Этот вопрос также перекрестно ссылается на форумах SmartGWT, поскольку я также использую эту структуру. – JEberhardt

+0

Помимо методов, которые не вызываются, в консоли вашего браузера нет других ошибок? Вы уверены, что System.out делает то, что, по вашему мнению, делает в браузере? –

+0

Извините, что поздно ответ.Я нашел аналогичный ответ на SO. Я не могу найти OP, но предоставит ссылку, когда попаду на нее. По какой-то причине, когда я добавляю возврат к функциям JSNI, он работает, и я вижу инструкции System.out. – JEberhardt

 Смежные вопросы

  • Нет связанных вопросов^_^