2011-11-15 147 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