我再次与JSNI回调问题作斗争(请参阅我的发布历史记录)。我正在为Foundation Joyride(巡演)制作一个包装器。导览正确运行,但“postRideCallback”(在巡视结束后调用)不会触发。如果我使用(接近)相同的语法从控制台调用巡视,则回调会触发。
这是从控制台起作用的:
$(document).foundation(
{ joyride :
{ post_ride_callback : function()
{ window.alert('hello world'); }
}
}).foundation('joyride', 'start')
这是相关的GWT代码;调用start()运行巡视,但永远不会调用回调。
public void start() {
__native_start(endTour(this), anotherFunction(this));
}
public native static void __native_start(JavaScriptObject endTour, JavaScriptObject
anotherFunction) /*-{
anotherFunction(); // this runs
$wnd.$($doc).foundation(
{ joyride :
{ postRideCallback: function() // this does not run
{
anotherFunction();
endTour();
}
}
}
).foundation('joyride', 'start');
}-*/;
public static native JavaScriptObject endTour(Tour tour) /*-{
return tour == null ? null : $entry(function() {
tour.@io.myapp.client.ui.widgets.foundation.Tour::tourHasEnded()()
});
}-*/;
public static native JavaScriptObject anotherFunction(Tour tour) /*-{
return tour == null ? null : $entry(function() {
tour.@io.myapp.client.ui.widgets.foundation.Tour::callbackSuccess()()
});
}-*/;
public void callbackSuccess() {
Window.alert("hello yes");
}
编辑 - 这里要清楚:
a)请注意,对anotherFunction()的第一次调用有效。在运行巡视之前,它会弹出“hello yes”的警报。
b)如果我用window.alert('hello world');
或$wnd.alert('hello world')
替换postStepCallback函数的主体,则没有任何反应。所以我不认为这与GWT参考本身有任何关系(尽管我看到它们似乎是错误的)。
EDIT2 - 好的,每个Tomasz做了一些修改(并删除了$ entry样板作为实验)。新行为 - 开发模式控制台中的堆栈跟踪(代码之后):
public void start() {
__native_start(endTour(this), anotherFunction(this));
}
public native static void __native_start(JavaScriptObject endTour, JavaScriptObject anotherFunction) /*-{
anotherFunction();
$wnd.$($doc).foundation(
{ joyride :
{ postRideCallback: function() { endTour(); } }
}
).foundation('joyride', 'start');
}-*/;
public static native JavaScriptObject endTour(Tour tour) /*-{
return tour.@io.myapp.client.ui.widgets.foundation.Tour::tourHasEnded();
}-*/;
public static native JavaScriptObject anotherFunction(Tour tour) /*-{
return tour.@io.myapp.client.ui.widgets.foundation.Tour::callbackSuccess();
}-*/;
public void tourHasEnded() {
Window.alert("hello double");
}
public void callbackSuccess() {
Window.alert("hello yes");
}
堆栈跟踪:
com.google.gwt.core.client.JavaScriptException: (String) : Invoking an instance method on a null instance
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.google.gwt.dev.shell.ModuleSpace.createJavaScriptException(ModuleSpace.java:80)
at com.google.gwt.dev.shell.ModuleSpace.createJavaScriptException(ModuleSpace.java:64)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:60)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeVoid(ModuleSpace.java:299)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeVoid(JavaScriptHost.java:107)
at io.myapp.client.ui.widgets.foundation.Tour.__native_start(Tour.java)
答案 0 :(得分:0)
答案:我使用旧的(基础4)驼峰案例而不是GWT代码中的下划线选项名称。在控制台中,我发现昨晚的下划线是正确的,但是当我今天早上用GWT尝试这个时,我就忘记了这一点。啊。