我有一个主类(比如说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
包层次结构)。
答案 0 :(得分:2)
您的问题是this
。调用该函数时,this
不是您的StockWatcher
类(它将是您的#message
元素)。您必须在方法顶部使用$.proxy
或简单var that = this
。这完全是关于范围界定。
顺便说一下,你还应该用$entry
包装你的函数:它将确保GWT中的一些事情顺利进行:异常被路由到GWT.UncaughtExceptionHandler
,命令被安排通过< / em> Scheduler#scheduleEntry
和Scheduler#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()(); }),
…