GWT разделяет стили CSS не работает

Мне нужно использовать один и тот же стиль в нескольких шаблонах Binder UI, поэтому я сделал все, как описано в: https://developers.google.com/web-toolkit/doc/latest/DevGuideUiBinder.

Итак, я сделал следующее:

1. Создан интерфейс ресурсов:

Открытый интерфейс Ресурсы расширяет ClientBundle {
    @Source("shared.css")
    Стиль стиля ();

    Открытый интерфейс Стиль расширяет CssResource {
        Строка grayedOut ();
    }
}

2. Создано shared.css файл в том же каталоге, что и класс Resources:

.серым цветом{
    цвет фона: красный;
}

3. Добавлено with элемент в шаблон пользовательского интерфейса Binder:<ui:with type="correct.package.Resources" field="res"/>

4. Добавлена ​​ссылка на стиль в шаблоне UI Binder: addStyleNames="{res.style.grayedOut}"

Однако это не работает. Представление отображается так же, как стиль grayedOut вообще не применялся.

Но я заметил две вещи:

  1. В Firebug/Chrome Dev Tools я вижу, что элементу присвоено название стиля, соответствующее стилю, который я пытаюсь добавить: class="GAWERH0MI gwt-TabLayoutPanelContent" (GAWERH0MI похоже соответствуют моему grayedOut класс), но я не могу найти его на панели "Стили элементов", что, вероятно, означает, что этот класс пуст (без тела). (Я провел эксперимент и назначил пустой класс элементу с тем же эффектом в этих инструментах).
  2. Когда я изменяю имя стиля в.css, я получаю ошибку во время выполнения этого стиля grayedOut не может быть найдено, что означает, что мой класс стиля обычно успешно найден, но по какой-то причине не работает должным образом.

2 ответа

Решение

Вы, вероятно, забыли позвонить ensureInjected() на Resources.Style пример.

Это делается автоматически для <ui:style> (потому что вы не кодируете ClientBundle а также CssResource интерфейсы, они создаются для вас UiBinder), но не для каких-либо других CssResource,

Ты можешь использовать @UiField Resources res тем не менее, это будет введено со значением <ui:with field="res">и, таким образом, вызвать res.style().ensureInjected() сразу после звонка createAndBindUi,
ИМО, однако вы бы лучше ввести Resources экземпляр на ваш взгляд и использовать @UiField(provided=true)и, таким образом, либо убедитесь, что ensureInjected() вызывается до того, как экземпляр внедряется в ваше представление, или выберите вызов ensureInjected() в каждом из ваших взглядов. Как в https://developers.google.com/web-toolkit/doc/latest/DevGuideUiBinder

UI виджет Java-файл:

@UiField
Resources res;
public YourWidget() {
        initWidget(uiBinder.createAndBindUi(this));     
        res.style().ensureInjected();
    }

UI виджет XML-файл:

<ui:with field='res' type="your path to Resource class" />

а также

<g:Label addStyleNames="{res.style.grayedOut}" ui:field="icon"></g:Label>
Другие вопросы по тегам