2014-02-18 41 views
0

我再次與JSNI回調作鬥爭(請參閱我的發佈歷史記錄)。我正在爲Foundation Joyride(旅遊)打造包裝。遊覽正常運行,但「遊程結束」(遊覽結束後調用)不會觸發。如果我使用(接近)相同的語法從控制檯調用遊覽,則回調會觸發。從基金會JSNI回調GWT功能 - 不被解僱

這裏是什麼工作,從控制檯:

$(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第一次調用()的作品。在運行遊覽之前,它會彈出一個提示「hello yes」。 b)如果我用window.alert('hello world');$wnd.alert('hello world')替換postStepCallback函數的主體,則沒有任何反應。所以我不認爲這與GWT參考本身有任何關係(儘管我看到他們似乎錯了)。

編輯2 - 好的,對每個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 [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) 

回答

0

答:我用的是舊的(基金會4)駱駝,而不是強調在分離式選項名稱GWT代碼。在控制檯中,我發現昨天晚上的下劃線是正確的,但是我今天早上在GWT上試了這個時忘了這一點。啊。