0

私は、メイン クラス (たとえばStockWatcher) が JSNI を呼び出して、ページの読み込み時に本文内に jQuery UI ダイアログを定義しました。ダイアログはJSNI関数内で呼び出されます。でonModuleLoad、私は次のようなことをしますprepareUI();。JSNI は次のprepareUIように実行されます。

public void native prepareUI() /*-{
  $wnd.jQuery($doc).ready(function($) { 
    message = "<div id = 'message'>Don't do this...</div>
    $(message).appendTo("body");
    $( "#message" ).dialog({
            modal: true,
            buttons: {
                Ok: function() {
                    $( this ).dialog( "close" );
                }
            },
            close:function() {  this.@com.google.gwt.sample.stockwatcher.client.StockWatcher::doit()(); },
            autoOpen: true,
            show: {
            effect: "puff",
            duration: 500
            },
            hide: {
            effect: "explode",
            duration: 500
            }
        });
 });
}-*/;

これに関数が続きdoit()ますが、これは非常に単純です。

public void doit() {
  Window.alert("Foo");
}

ただし、ページの読み込み時に、ダイアログが正しく表示され、Okボタンをクリックすると正しく閉じても、アラートはポップアップしません (コンソールにエラーは表示されません)。誰でもこれを修正する方法を教えてもらえますか? これが行われるクラスはStockWatcherパッケージ内にありますcom.google.gwt.sample.stockwatcher.client(デフォルトの GWTStockWatcherパッケージ階層を想像してください)。

4

1 に答える 1

2

あなたの問題はthisです。関数が呼び出されたとき、thisあなたのStockWatcherクラスではありません(それはあなたの#message要素になります)。メソッドの先頭で$.proxyor シンプルを使用する必要があります。スコープvar that = thisがすべてです。

ところで、関数を でラップする必要もあります$entry。これにより、GWT でいくつかのことがうまくいくようになります。例外は にルーティングされ、コマンドはおよびを介しGWT.UncaughtExceptionHandlerてスケジュールされ、正しく呼び出されます。 Scheduler#scheduleEntryScheduler#scheduleFinally

使用例$.proxy

var closeFn = $.proxy($entry(function() {
    this.@com.google.gwt.sample.stockwatcher.client.StockWatcher::doit()();
  }), this);
$wnd.jQuery($doc).ready(function($) {
  …
  $( "#message" ).dialog({
    …
    close: closeFn,
…    

使用例var that = this

var that = this;
$wnd.jQuery($doc).ready(function($) {
  …
  $( "#message" ).dialog({
    …
    close: $entry(function() { that.@com.google.gwt.sample.stockwatcher.client.StockWatcher::doit()(); }),
…
于 2013-03-07T16:54:51.873 に答える