Отложенное связывание не работает после компиляции - PullRequest
1 голос
/ 15 ноября 2011

У меня странная проблема с отложенным связыванием. Я определил следующий модуль:

<?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>

Это работает как чудо, когда я нахожусь в режиме разработки (т.е. когда я запускаю свое приложение из Eclipse). Однако, если я скомпилирую приложение и разверну его (в Jetty, но у меня этого нет, вот в чем проблема), то отложенное связывание не работает и ожидаемые классы не загружаются. Я проверил, и cookie настроен правильно с правильным значением c01, но класс com.example.client.ui.menu.MainMenuView01 не загружен.

Я что-то упустил? Я что-то не так делаю?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Я выяснил, в чем проблема, и я пишу это здесь на случай, если другие могут быть заинтересованы.

Модуль, который я определил (см. Код в моем вопросе), определяет свойство, значение которого берется из файла cookie, которое генерируется после входа пользователя в приложение.

Изначально у меня было GWT Place для входа в систему, и когда пользователь успешно аутентифицировал приложение, оно переместилось в другое место. В этом случае, когда пользователь входит в приложение и GWT Javascript загружается в браузер, cookie еще не установлен (поскольку пользователь еще не выполнил вход в систему). Поэтому отложенное связывание не работает, и ожидаемые классы (например, com.example.client.ui.menu.MainMenuView01) не загружаются.

Понятия не имею, почему это работает правильно при запуске в режиме разработки. Тем не мение. Решение, которое я реализовал, состоит в том, чтобы переместить фазу входа за пределы приложения GWT, и, когда вход успешен, я добавляю cookie и перенаправляю пользователя к реальному приложению GWT.

0 голосов
/ 15 ноября 2011

Есть две возможности. Вы делаете что-то не так, или есть другая ошибка в компиляторе GWT. Я пытался реализовать такой случай, как ваш, и он работал при компиляции без проблем. Так что, скорее всего, на вашей стороне может быть какая-то ошибка. Поэтому я рекомендую скомпилировать приложение с -style PRETTY и посмотреть, как оно было скомпилировано. найдите функцию с именем com_example_client_ui_menu_MainMenuView () и посмотрите, сможет ли она создать MainMenuView01, попробуйте отладить ее и т. д. В любом случае, этот тип материала должен работать без проблем.

Также попробуйте отладить вашего провайдера свойств (и используйте vars $ doc и $ wnd в провайдере свойств вместо окна)

Другим возможным случаем является то, что cookie может быть недоступен для чтения из JS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...