2011-11-15 78 views
1

我有一個奇怪的延遲綁定問題。我已經定義了以下模塊:延遲綁定編譯後不工作

<?xml version="1.0" encoding="UTF-8"?> 

<!-- Defines the usercategory property and its provider function. --> 
<module> 

    <define-property name="usercategory" values="c00,c01,c02" /> 
    <collapse-property name="usercategory" values="*" /> 

    <property-provider name="usercategory"><![CDATA[ 
     // Look for the usercategory cookie 
     var cs = document.cookie.split(';'); 
     for (var i = 0; i < cs.length; i++) { 
      var name = cs[i].substr(0, cs[i].indexOf("=")); 
      var value = cs[i].substr(cs[i].indexOf("=") + 1); 
      name = name.replace(/^\s+|\s+$/g,""); 
      if (name == "usercategory") { 
       return unescape(value); 
      } 
     } 

     return "c00"; 
    ]]></property-provider> 

</module> 

其通過觀察一個名爲usercategory cookie的值設置屬性usercategory

我使用這個屬性application.gwt.xml推遲一些類的結合,例如:

<inherits name="com.example.UserCategory"/> 

<replace-with class="com.example.client.ui.menu.MainMenuView01"> 
    <when-type-is class="com.example.client.ui.menu.MainMenuView"/> 
    <when-property-is name="usercategory" value="c01"/> 
</replace-with> 

這就像一個魅力當我在開發模式(即從內部運行我的應用程序時,蝕)。但是,如果我編譯應用程序並部署它(在Jetty中,但我不這是問題),則延遲綁定似乎不起作用,並且不會加載期望的類。我檢查過了,cookie的設置正確,值爲c01,但com.example.client.ui.menu.MainMenuView01未加載。

我錯過了什麼嗎?難道我做錯了什麼?

預先感謝您!

+0

您是否嘗試將調試語句放入屬性提供程序中以查看發生了什麼?像'console.log'輸出一些正在分析的值? – Strelok

+0

我試過了。 'console.log'上的消息如我所料,但應用程序不像我預期的那樣:'com.example.client.ui.menu.MainMenuView01'未加載。不過,我注意到,如果我點擊瀏覽器的重新加載按鈕,那麼一切正常......只是不知道爲什麼。無論如何,我不能要求我的用戶點擊重新加載:( – MarcoS

回答

0

我想通看看問題出在哪裏,如果其他人可能有興趣,我會寫在這裏。

我定義的模塊(請參閱我的問題中的代碼)定義了一個屬性,其值取自用戶登錄應用程序後生成的cookie。

本來我有一個GWT Place爲登錄,並且當用戶成功驗證應用程序移動到另一個地方。在這種情況下,當用戶進入應用程序,並且GWT Javascript下載到瀏覽器時,cookie尚未設置(因爲用戶還沒有執行登錄)。因此延遲綁定不起作用,並且預期的類(如com.example.client.ui.menu.MainMenuView01)未加載。

我不知道爲什麼這種方式在開發模式下運行時可以正常工作。無論如何。我實現的解決方案是將登錄階段移到GWT應用程序之外,並且當登錄成功時,我添加cookie並將用戶重定向到實際的GWT應用程序。

0

有兩種可能性。你做錯了什麼,或者GWT編譯器中有另一個錯誤。我試圖實現一個像你這樣的案例,並且在編譯時沒有任何問題。所以很可能你身邊會有一些錯誤。所以我建議要做的是用-style PRETTY編譯應用程序,看看它是如何編譯的。找到名爲com_example_client_ui_menu_MainMenuView()的函數,看看它是否能夠創建MainMenuView01,嘗試調試它等。總之,這種東西應該沒有任何問題。

也嘗試調試你的財產提供商(和使用瓦爾物業提供商,而不是窗口$ doc和$ WND)

另一種可能的情況是,該cookie可能無法讀取從JS

+0

我可能做錯了什麼,但爲什麼在開發模式下運行這個相同的代碼? – MarcoS

+0

因爲我沒有你的代碼,我不能說明原因。從GWT.isScript()到生產中返回的數據與本地環境之間的差異有很多可能性(例如,由於某些生產設置,應用程序流可能會有所不同,因此對於軟排列的GWT.create isn' t甚至調用)。一些編譯器故障也是可能的(我在GWT編譯器中刪除了一些有用的代碼時遇到過很少的情況)。試着去編譯應用程序,看看問題是否真的是延遲綁定。 – jusio

+0

我試圖調試。我注意到,如果我點擊瀏覽器的重載按鈕,那麼一切正常......只是不知道爲什麼。無論如何,我不能要求我的用戶點擊重新加載 – MarcoS