2011-12-15 4 views
3

私は組み込みのWebブラウザ(Sketchup)用にGWTのアプリを設計しています。私はwindow.locationの値を "skp :: myFunciton @ myParams"に変更してSketchupを制御することができます。 Sketchupはブラウザでjavascriptを実行できます。私がしたいのは、そのモデルの内容を私に与えるためにsketchupにお願いすることです。javacriptからjava(A GWT物語)

public static native void getModel() /*-{ 
    $wnd.location = "skp:[email protected]"; 
}-*/; 

2番目のスケッチアップの後に結果があります。しかし、どうやってそれを元に戻すのですか?問題は、エントリポイントのインスタンスがリクエストを開始し、JSNIが静的メソッドのみをjavascriptにマップできることです。私はイベントや要素を持つソリューションを持っていたと思っ

...

//Sketchup javascript 
var gwtwidget = document.getElementById("myTextArea") 
gwtwidget.value = "blahblah"; 
gwtwidget.onchange(); 

、その後GWTの変化を聴きます。うーん、それは動作しません。 Gwt自身のイベントシステムは、イベントをオーバーライド、シンク、抑止(または何でも)します。私はどのようなアプローチを取るべきですか?私は情報を求めてウェブを通ってきましたが、私は確かにそれを取り巻くことはできません。私は...答えはどちらかである

1コール(何とか)JavaScriptからエントリポイントインスタンスメソッドを推測している
2ファイア(何とか)GWTによってピックアップされるJavaScriptからイベント
3セットアップ非同期コールバックインターフェイスのメカニズム(何とか)

答えて

6

インターフェイスはかなりシンプルでなければなりません。

たとえば、GWTにオブジェクトがあるとします。私たちは、いくつかのコールバックをパラメータとして受け入れるJSでいくつかの関数を持っているとしましょう。あなたはインスタンスメソッドを呼び出したい場合は

public static native void executeFunctionWithCallBack(MyCallback callback)/*-{ 
      var callBackWrapper =function(param) { 
       [email protected]::onSuccess(*)(param); 
      } 
      $wnd.invokeFunctionWithCallback(callbackWrapper) 
    }-*/; 

が、あなたはそれが同様に呼ばれるべきではない唯一の方法ではなく、インスタンスを公開する必要があります。だから、GWTで、私たちはこのようなものを持っています。例えば。 JSNIメソッドにパラメータとしてインスタンスを渡す必要があります(あるいは、JSNIから取得する必要があります)。次にインスタンスのメソッドを呼び出すJS関数を作成します。それで全部です。それ以上の魔法=)

+0

これは本当にいいようです。私はそれを試してみましょう。 – noelwarr

+0

もう少し魔法があります:$ entry(...)関数については、http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#callingを参照してください。この関数は、JavaScriptに公開されたJavaメソッドをラップするために使用する必要があります。 Javaコードで発生する可能性のある例外を処理するために使用します。 'var callBackWrapper = $ entry(function(param){...});' – haui

関連する問題