0

我有主类(比如StockWatcher)调用 JSNI 来在页面加载时在正文中定义一个 jQuery UI 对话框。该对话框在JSNI函数内调用。上onModuleLoad,我做类似的事情prepareUI();prepareUIJSNI 运行如下:

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元素)。您必须在方法的顶部使用$.proxy或简单。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 回答