何时使用GWT ensureInjected()?

时间:2010-03-09 04:32:47

标签: css gwt

我在CSSResource中创建了一些样式,无论我使用

,它都运行良好
GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();

与否。

有没有人可以了解这一点并解释何时使用ensureInjected?

谢谢! 丹尼尔

4 个答案:

答案 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。