我在CSSResource中创建了一些样式,无论我使用
,它都运行良好GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();
与否。
有没有人可以了解这一点并解释何时使用ensureInjected?
谢谢! 丹尼尔
答案 0 :(得分:8)
正如Christian所说,在里面的UiBinder ui.xml
文件,您不必担心调用ensureInjected()
,以下XML语句可以完成这项工作:
<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>
当然这假设某个地方定义了MyStyle
接口:
public interface MyStyle {
public String redBorder();
}
现在我同意你的看法,当你需要操作UiBinder模板的CssResource
扩展外时,事情会变得烦人。正是因为在将ensureInjected()
实例与小部件一起使用之前,您必须在某处调用MyStyle
。
我个人使用GIN在需要时使用CssResource
扩展实例。这样您就可以实现自定义GIN提供程序,确保在注入ensureInjected()
之前调用CssResource
它。
这涉及三个步骤:
为MyStyle
创建一个界面以及一个CSS文件
的 MyStyle.java 强>
public interface MyStyle {
public String redBorder();
}
<强> MyStyle.css 强>
.redBorder { border: 1px solid red; }
通过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
个实例
例如(在某些MVP上下文中):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}
答案 1 :(得分:6)
好问题 - 我想到的一种情况是,当你想在UiBinder模板中使用某些全局样式表中的样式时 - 那么你需要调用ensureInjected
来确保样式确实被注入你正在引用它们(你在xml中定义的“本地”UiBinder样式是自动注入的。)
您可以在Mail example:
中看到这样使用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
}
注意在绑定UI之前如何调用ensureInjected
。
这是我所知道的唯一保证使用ensureInjected
的情况,但也许我错过了一些。
答案 2 :(得分:6)
规则很简单:除非在UiBinder模板中ensureInjected()
生成CssResource
,否则必须明确调用<ui:style>
(因为大部分时间你都不会掌握生成的CssResource
具体而言,<ui:with>
不对CssResource
提供特殊处理。
此外,一些小部件将特定ClientBundle
作为构造函数的参数(例如CellTable
),然后他们将在他们使用的ensureInjected()
上调用CssResource
。
答案 3 :(得分:1)
如果您使用UiBinder,则对标签ui:with提供对ensureInjected的调用。对于您在客户端包中使用的任何其他css(即遗留的css除外)并且未在ui:with block中声明,您必须显式调用ensureInjected。