Обратный вызов JSNI для функции GWT из Foundation - не запускается

Я снова борюсь с проблемой обратных вызовов 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)

person user717847    schedule 18.02.2014    source источник


Ответы (1)


Ответ: Я использовал старый (Foundation 4) регистр верблюда, а не подчеркивал отдельное имя параметра в коде GWT. Вчера вечером в консоли я понял, что подчеркивание было правильным, но забыл об этом, когда сегодня утром пробовал это с GWT. Фу.

person user717847    schedule 18.02.2014