Comme Christian a dit, l'intérieur le fichier UiBinder ui.xml
vous n'avez pas à vous soucier d'invoquer ensureInjected()
, les déclarations XML suivantes font le travail:
<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>
Bien sûr, cela suppose que il y a quelque part une interface MyStyle
définie:
public interface MyStyle {
public String redBorder();
}
maintenant, je suis d'accord avec ith vous que les choses deviennent ennuyeux quand vous avez besoin de manipuler l'CssResource
extension en dehors de des modèles UiBinder. Précisément parce que vous devez prendre soin d'appeler ensureInjected()
quelque part avant d'utiliser l'instance MyStyle
avec vos widgets.
J'utilise personnellement GIN pour injecter des instances d'extensions de CssResource
chaque fois que je besoin them.That comme vous pouvez mettre en œuvre un fournisseur de GIN personnalisé assurant que ensureInjected()
est appelée sur le CssResource
avant de l'injecter. Il y a trois étapes: il impliquées
Créer une interface pour MyStyle
à côté d'un fichier CSS.
MyStyle.java
public interface MyStyle {
public String redBorder();
}
MyStyle.
css .redBorder { border: 1px solid red; }
Expose à travers une extension ClientBundle
.
Resources.java
public interface Resources extends ClientBundle {
@Source("MyStyle.css")
public MyStyle style();
}
Configurer une méthode de fournisseur de GIN pour injecter vos instances de 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;
}
}
Nous injectons en douceur l'instance Resources
ci-dessus, ce qui signifie que plus d'un tracas accesseur statique appeler GWT.<Resources>create(Resources.class)
partout, juste tout passe par l'injection de GIN.
Après avoir fait que vous pouvez injecter vos instances de MyStyle
lorsque vous en avez besoin.
Par exemple (dans un contexte MVP):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}
Oui, je compris cela aussi, mais: J'utilise un fichier global css et il fonctionne bien si j'utilise ensureInjected ou non. C'est le mystère que je tente de résoudre. – user198313