我在CSSResource中创建了一些样式,无论我使用它都能很好地工作
GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();
Run Code Online (Sandbox Code Playgroud)
或不.
任何人都可以了解这一点并解释何时使用ensureInjected?
谢谢!丹尼尔
正如Christian所说,在 UiBinder ui.xml文件中你不必担心调用ensureInjected(),以下XML语句可以完成这项工作:
<ui:with field='myStyle' type='com...MyStyle'/>
Run Code Online (Sandbox Code Playgroud)
<div class='{myStyle.redBorder}'/>
Run Code Online (Sandbox Code Playgroud)
当然这是假设某个MyStyle界面定义了:
public interface MyStyle {
public String redBorder();
}
Run Code Online (Sandbox Code Playgroud)
现在我同意你的看法,当你需要在 UiBinder模板之外操作CssResource扩展时,事情会变得烦人.正是因为在使用小部件实例之前必须先处理某个地方的调用.ensureInjected()MyStyle
我个人使用GIN注入的扩展的情况下,CssResource每当我需要了进来,您就可以实现自定义GIN提供商确保ensureInjected()被称为在CssResource注射之前.这涉及三个步骤:
创建一个MyStyle与CSS文件一起使用的界面.
MyStyle.java
public interface MyStyle {
public String redBorder();
}
Run Code Online (Sandbox Code Playgroud)MyStyle.css
.redBorder { border: 1px solid red; }
Run Code Online (Sandbox Code Playgroud)通过ClientBundle扩展程序公开它.
Resources.java
public interface Resources extends ClientBundle {
@Source("MyStyle.css")
public MyStyle style();
}
Run Code Online (Sandbox Code Playgroud)配置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;
}
}
Run Code Online (Sandbox Code Playgroud)我们Resources在上面顺利注入实例,这意味着不再需要GWT.<Resources>create(Resources.class)在任何地方调用静态访问器,只需通过GIN注入即可.
完成后,您可以MyStyle在需要时注入实例.
例如(在某些MVP上下文中):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}
Run Code Online (Sandbox Code Playgroud)
好问题 - 我想到的一种情况是,当你想在UiBinder模板中使用来自某些全局样式表的样式时 - 那么你需要调用ensureInjected...确保在引用它们时确实注入了样式("本地" "在xml中定义的UiBinder样式是自动注入的.
您可以在Mail示例中看到这样使用:
public void onModuleLoad() {
// Inject global styles.
GWT.<GlobalResources>create(GlobalResources.class).css().ensureInjected();
// Create the UI defined in Mail.ui.xml.
DockLayoutPanel outer = binder.createAndBindUi(this);
// ...rest of the code
}
Run Code Online (Sandbox Code Playgroud)
请注意ensureInjected在绑定UI之前如何调用.
这是我知道保证使用的唯一情况ensureInjected,但也许我错过了一些东西.
规则很简单:你必须ensureInjected()明确调用,除非CssResource是从<ui:style>UiBinder模板中生成的(因为大部分时间你都没有生成的句柄CssResource.
具体来说,<ui:with>没有为CssResources 提供特殊处理.
此外,一些小部件采取特定ClientBundle的参数构造函数(如CellTable),便会调用ensureInjected()在CssResource他们使用.