我在CSSResource中创建了一些样式,无论是否使用
GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();
或不。
谁能阐明这一点,并解释何时使用ensureInjected?
谢谢!
丹尼尔
最佳答案
正如克里斯蒂安所说,在UiBinder ui.xml
文件中,您不必担心调用ensureInjected()
,以下XML语句可以完成此工作:
<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>
当然,这是假设在某个地方定义了
MyStyle
接口(interface):public interface MyStyle {
public String redBorder();
}
现在,我同意您的意见,当您需要在UiBinder模板之外操作
CssResource
扩展时,事情会变得很烦人。正是因为您必须在将ensureInjected()
实例与窗口小部件一起使用之前,在某处调用MyStyle
来处理。我个人使用GIN在需要时注入(inject)
CssResource
扩展实例,这样您就可以实现一个自定义GIN提供程序,以确保在注入(inject)ensureInjected()
之前调用CssResource
。其中涉及三个步骤:
MyStyle
创建一个接口(interface)。MyStyle.java
public interface MyStyle {
public String redBorder();
}
.redBorder { border: 1px solid red; }
ClientBundle
扩展名公开它。Resources.java
public interface Resources extends ClientBundle {
@Source("MyStyle.css")
public MyStyle style();
}
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;
}
}
我们在上面顺利地注入(inject)了
Resources
实例,这意味着不再需要在任何地方调用GWT.<Resources>create(Resources.class)
的静态访问器,而这一切都是通过GIN注入(inject)实现的。完成后,您可以在需要时注入(inject)
MyStyle
实例。例如(在某些MVP上下文中):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}