2010-03-09 4 views
17

J'ai créé quelques styles dans un CSSResource et il fonctionne bien si j'utiliseQuand utiliser GWT ensureInjected()?

GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected(); 

ou non.

Quelqu'un pourrait-il nous éclairer à ce sujet et vous expliquer quand utiliser EnsureInjected ou non?

Merci! Daniel

Répondre

6

Bonne question - une situation qui vient à l'esprit est quand vous voulez utiliser des styles de certains stylesheet global dans un modèle de UiBinder - alors vous devez appeler ensureInjected pour ... assurer que les styles sont en effet injecté lorsque vous les référençant (les styles UiBinder "locaux" que vous définissez en XML sont automatiquement injectés).

Vous pouvez le voir utilisé en tant que tel dans le 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 
} 

Notez comment ensureInjected est appelée avant la liaison de l'interface utilisateur.

C'est la seule situation que je sais qui justifie l'utilisation ensureInjected, mais peut-être que j'ai raté quelque chose.

+0

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

1

Si vous utilisez UiBinder, l'appel de EnsureInjected est fourni par le tag ui: with. Pour tout autre CSS que vous utilisez dans un bundle client (c.-à-d. Un css legacy exclu) et qui n'est pas déclaré dans un bloc ui: with, vous devez appeler explicitement EnsureInjected.

+2

J'utilise UiBinder exclusivement, mais pour moi, il n'est pas fourni ... Je devais l'appeler explicitement. – buc

+0

@buc ​​vous avez raison, j'ai fait mon commentaire plus clair. –

8

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()); 
} 
+0

Avez-vous vraiment besoin de l'annotation '@ Inject' sur' createStyle() '? –

+0

Est-ce que ClientMOdule.java doit faire référence à 'MyStyle' au lieu de' Style'? –

6

La règle est simple: vous devez appeler ensureInjected() explicitement, à moins que le CssResource est généré à partir d'un <ui:style> dans un modèle de UiBinder (parce que la plupart du temps, vous ne sera pas une poignée sur le produit CssResource.
plus précisément, <ui:with> fournit aucun traitement spécial pour CssResource s.

en outre, quelques widgets prendre un ClientBundle spécifique comme argument d'un constructeur (par exemple CellTable), ils seront ensuite appeler ensureInjected() sur la CssResource qu'ils utilisent.

+0

Pouvez-vous être un peu plus précis sur 'ui: with'. Est-ce que EnsureInjected() doit être appelé ou pas? Parce que –

+0

'ui: with' ne rien de spécial en ce qui concerne' CssResource', cela signifie que, oui, vous devez appeler 'ensureInjected()' _manually_, explicitement. –

+0

Y at-il un moyen d'inclure automatiquement CssResource quand il est appelé depuis uiBinder? Non –