我在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()); }