我在CSSResource中创建了一些样式,无论我使用什么样,它都可以很好的工作
- GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();
或不。
任何人都可以清楚这一点,并解释什么时候使用ensure?
谢谢!
丹尼尔
解决方法
正如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扩展时,会让人烦恼。正是因为在使用MyStyle实例和小部件之前,必须注意调用ensureInjected()。
我个人使用GIN来注入CssResource扩展的实例,只要我需要它们。这样可以实现一个自定义的GIN提供程序,确保在注入之前在CssResource上调用ensureInjected()。
这里涉及三个步骤:
>为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;
- }
- }
我们顺利地将资源实例注入上面,这意味着在任何地方,无论是调用GWT的静态访问器(资源> create(Resources.class)),都只会发生在GIN注入中。
完成之后,您可以在需要时注入MyStyle的实例。
例如(在某些MVP上下文中):
- private Widget widget;
- @Inject
- public SomeView(final MyStyle style) {
- //...
- widget = uiBinder.createAndBindUi(this);
- widget.addStyleName(style.redBorder());
- }