Я снова борюсь с проблемой обратных вызовов 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() {
[email protected]::tourHasEnded()()
});
}-*/;
public static native JavaScriptObject anotherFunction(Tour tour) /*-{
return tour == null ? null : $entry(function() {
[email protected]::callbackSuccess()()
});
}-*/;
public void callbackSuccess() {
Window.alert("hello yes");
}
РЕДАКТИРОВАТЬ - просто чтобы быть ясным здесь:
а) Обратите внимание, что первый вызов AnotherFunction() работает. Перед запуском тура появляется всплывающее предупреждение с «привет, да». б) Если я заменю тело функции postStepCallback на window.alert('hello world');
или $wnd.alert('hello world')
, ничего не произойдет. Поэтому я не верю, что это имеет какое-то отношение к ссылкам GWT как таковым (хотя я вижу, что они кажутся неверными).
EDIT2 - хорошо, сделал некоторые изменения для Томаша (и удалил шаблон $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 [email protected]::tourHasEnded();
}-*/;
public static native JavaScriptObject anotherFunction(Tour tour) /*-{
return [email protected]::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)