Как сказал Кристиан, внутри файл UiBinder ui.xml
вам не придется беспокоиться о вызове ensureInjected()
, следующие операторы XML делают работу:
<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>
Конечно, это предполагает, что есть где-то интерфейс MyStyle
определяется:
public interface MyStyle {
public String redBorder();
}
Теперь я согласен ш с вами, что все становится раздражающим, когда вам нужно манипулировать расширением CssResource
за пределами шаблонов UiBinder. Именно потому, что вы должны позаботиться о том, чтобы вызвать ensureInjected()
где-нибудь перед использованием экземпляра MyStyle
с вашими виджетами.
Я лично использую GIN впрыснуть экземпляры расширений CssResource
всякий раз, когда мне нужно them.That способ можно реализовать пользовательский поставщик GIN гарантируя, что ensureInjected()
называется на CssResource
перед впрыскиванием. Есть три шага, участвующих там:
Создать интерфейс для MyStyle
вместе с файлом CSS.
MyStyle.java
public interface MyStyle {
public String redBorder();
}
MyStyle.CSS
.redBorder { border: 1px solid red; }
Expose его через ClientBundle
расширения.
Resources.java
public interface Resources extends ClientBundle {
@Source("MyStyle.css")
public MyStyle style();
}
Настройка метода поставщика GIN впрыснуть экземпляры из MyStyle
.
ClientModule.java
public class ClientModule extends AbstractGinModule {
@Override
protected void configure() {
//...
}
@Provides MyStyle createStyle(final Resources resources) {
MyStyle style = resources.style();
style.ensureInjected();
return style;
}
}
Мы плавно впрыскивать экземпляр Resources
здесь выше, что означает, что нет больше хлопот статического аксессора вызывающего GWT.<Resources>create(Resources.class)
в любом месте, это просто все происходит через инъекцию GIN.
Сделав это, вы можете ввести свои экземпляры MyStyle
, когда они вам понадобятся.
Например (в некоторых ПМК контексте):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}
Да, я тоже это понял, но: Я использую глобальный файл css, и он хорошо работает, независимо от того, использую ли я makeInjected или нет. Это таинственность, которую я пытаюсь решить. – user198313