0

GWT アプリケーションの一部を、PHP から呼び出すことができる多くの個別のダイアログに抽出しようとしています。

既存の状態: WAR として JBoss にデプロイされた GWT アプリケーションがあります。アプリには、signle エントリ ポイントを持つ単一のモジュールがあります。メイン JSP は環境を設定し、document.write(); を使用して .nocache.js をロードする JS をいくつか持っています。エントリ ポイントの onModuleLoad() は、ブラウザを埋めるパネルを作成し、RootPanel.get("root").add(); を使用してルートに追加します。なんらかのイベントが発生すると (ユーザーがボタンを押すなど)、サブクラスを開始して center() または setVisible() を呼び出して DialogBox をポップアップします。

望ましい状態: さまざまな DialogBox サブクラスを呼び出すことができるように、複数のページを持つ php アプリが必要です。

php 側は document.write(); を使った JS 関数呼び出しを使うべきだと思います。GWT側に関しては、私が見るオプションは次のとおりです。

  1. 複数のエントリ ポイントを持つ 1 つのモジュール。
  2. 複数のモジュール。

ここでベストプラクティスとなるものについて、経験や理解を持っている人はいますか?

4

1 に答える 1

1

私の理解が正しければ、Javascript から GWT メソッドを呼び出す必要があります。JSNI を使用できます。しかし、GWT 側で gwt-exporter を試す必要があると思います。概要チュートリアル。GWT モジュール用の JS_API を作成するのは単純な GWT モジュールです。

ベストプラクティスのふりをするのではなく、簡単な例です。

サーバー側では、すべてのページに DialogBoxes を備えた既存の GWT モジュールを含めます。この GWT モジュールを変更するか、このように新規作成する必要があります。

public class GwtModule implements EntryPoint {
@Override
public void onModuleLoad() {

    // exportable class
    DialogBoxManager dbm = new DialogBoxManager();

    // export all Exportable classes of module
    ExporterUtil.exportAll();

    // needed cause JS_API will be available only after the GWT is loaded
    onLoad();
}

// call when GWT module loaded
private native void onLoad() /*-{
    $wnd.loaded();
}-*/;

DialogBoxManager は次のようになります

@Export
@ExportPackage("pkg")
public class DialogBoxManager implements ClickHandler, Exportable {

    private DialogBox db;

    public DialogBoxManager() {

        this.db = new DialogBox();
    }

    @Export("showDB")
    public void showDialog() {

        db.setVisible(true);
        db.center();
        db.show();
    }

    @Override
    public void onClick(ClickEvent event) {

        showDialog();
    }

}

@Export("show")、@ExportPackage("pkg") などの文字列値。注釈は、注釈付き GWT メソッドの JS_API 呼び出しで使用されます (フィールドもエクスポートできます)。@Export だけを使用できます (DialogBoxManager で行ったように)。

GWT モジュールが JS ライブラリにロードされると、JS_API メンバーの初期化または必要なものを実現できます。

var dbManager = null;
...


 function loaded() {
        dbManager = new pkg.DialogBoxManager();
    }

そして、このように JS_API を呼び出すだけです

function showDB() {
        if (dbManager != null) {
            dbManager.showDB();
        }
    }
于 2011-06-22T12:37:22.130 に答える