通过JSNI从jQuery滑块内调用Java函数

时间:2013-03-07 15:07:49

标签: java jquery gwt jsni

我有一个主类(比如说StockWatcher)调用一个JSNI来在页面加载时在体内定义一个jQuery UI对话框。该对话框在JSNI函数内调用。在onModuleLoad,我执行prepareUI();之类的操作。 prepareUI JSNI运行如下:

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(想象一下默认的GWT StockWatcher包层次结构)。

1 个答案:

答案 0 :(得分:2)

您的问题是this。调用该函数时,this不是您的StockWatcher类(它将是您的#message元素)。您必须在方法顶部使用$.proxy或简单var that = this。这完全是关于范围界定

顺便说一下,你还应该用$entry包装你的函数:它将确保GWT中的一些事情顺利进行:异常被路由到GWT.UncaughtExceptionHandler,命令被安排通过< / em> 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()(); }),
…