問題は非常に単純ですが、解決できない可能性がありますか? 少なくとも私にとっては :/
状況: サーバーが GWT モジュールを含む自己の追加コピーを提供する動的なページ システムがあるとします。つまり、クライアント側のメイン GWT インスタンスは、タグを使用してメイン インスタンス自体によって単純に追加される新しい着信 GWT スクリプトを管理することになっています。ここで、メインの GWT インスタンスは、新しく作成されたスクリプト インスタンスと、可能な限り最も簡単な (GWT 内部の) 方法で通信する必要があります。
では、何が問題外なのか: 絶対に必要ではないにしても、愚かな JSNI ラッパーを両側に書くことです。
私が思いついた解決策は次のとおりです。共通のインターフェースを含む両方のモジュールを使用するようにします。例:
package com.whatever.interfaces;
public interface Communication {
void showMessage(String message);
}
したがって、両方がこのモジュールを継承し、定義を認識します。メイン クライアントは動的 JS をロードし、Communication の実装を登録します。動的クライアントはそれを使用します。setPropertyObject を使用して、$wnd および要素に参照を格納しようとしました。$wnd では null です。GWT の Iframing に関連している可能性がありますか? たとえば、RootPanel 要素のプロパティの場合、ClassCastException が発生します。
これに遭遇する良い方法はありますか?私が持っている別のアイデアは、ブリッジ モジュールの実装としてインターフェイスを呼び出すために JSNI を使用することですが、これが良い方法かどうかはわかりません。
あなたの助けに感謝します、ありがとう。
編集:まあ、これはまったく不可能だという結論にほぼ達しました。どこかで同じインターフェイスを使用した可能性がありますが、同じモジュールを共通の基盤として使用していても、コンパイルされたさまざまなモジュールに対して、それらは非常に独自のインスタンスになります。JSNI を使用するアプローチは確かにいくらか可能ですが、すべての属性を実際の JS オブジェクトにマッピングし、それらを再マッピングしないわけにはいきません。つまり、おそらく慣れているように、複雑な Java オブジェクトを渡すことはできません。私の結論は、CodeGenerators を使用すると、両方のモジュールに対して JSNI ラッパーとリマッパーを自動的にビルドできるということですが、これは私にとって面倒すぎることです。
誰かがより良いアイデアを思いついた場合、私はまだ開いていますが、私の発見の内部を提供したいので、他の人が私の無駄な時間を利用できるようにします ;)