2017-01-04 8 views
2

現在、私はGWTプロジェクトで作業中です。外部のJavaScriptファイルで使用する必要があります。私は両側が適切に働いていることを確認するためのテストプロトタイプを今作成しています。GWT JSNIを使用してjsファイルと統合する

実行してコンパイルすると、呼び出されたイベントからブラウザにコンソールログが表示されます。ただし、GWT Javaメソッドは呼び出されていません。

多くのシナリオを試した後、exportStaticMethods()から$entryラッパーを削除すると、逆のことが起こることに気付きました。 System.outがJavaコードで呼び出されているのが見えますが、ブラウザのJavaScriptからのコンソールログは呼び出されていません。

私はこの現象の原因を突き止めようとしていますが、欠落している小さな欠点がある場合は見落としています。

私は既にcalling a Java method from jsのGWT JSNIのドキュメントを見直し、StackOverflowに関する他の関連する質問から解決策を見つけようとしました。

GWTとJava側

私は私のEntryPointクラスのonModuleLoad()方法に入ったとexportStaticMethods()という静的メソッドが追加されました。私はまた、PokePingClass.javaファイルを作成しました。プロジェクトの.htmlファイルで

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

、私は「IDの隠された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()(); 
        }); 

編集、メンバーの::演算子を忘れてしまいました。

+0

謝罪。関数のJSNI構文を修正しました。私はまだ同じ問題を守っています。私はjquery-2.2.4.min.jsも使用していることを忘れていました。これは現在、コンフリクトモードでは動作していません。この質問もSmartGWTフォーラムで相互参照されています。私はそのフレームワークも使用しています。 – JEberhardt

+0

呼び出されていないメソッド以外にも、ブラウザのコンソールに他のエラーはありませんか? System.outがブラウザで何をすると思いますか? –

+0

申し訳ありません。私はSOについて同様の答えを見つけました。私はOPを見つけることができませんが、私はそれを見つけたときにリンクを提供します。何らかの理由でJSNI関数にリターンを追加すると、動作しているように見え、System.outステートメントが表示されます。 – JEberhardt