2010-03-09 17 views
17

he creado un par de estilos en un CSSResource y funciona bien si utilizoCuándo usar GWT EnsureInjected()?

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

o no.

¿Alguien podría aclarar esto y explicar cuándo usar EnsureInjected o no?

¡Gracias! Daniel

Respuesta

6

Buena pregunta - una situación que viene a la mente cuando se desea utilizar estilos de alguna hoja de estilo global en una plantilla UiBinder - entonces usted necesita llamar a ensureInjected ... asegurar que los estilos son de hecho cuando se inyecta están haciendo referencia a ellos (los estilos UiBinder "locales" que usted define en xml se inyectan automágicamente).

se puede ver este utilizó como tal en la 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 
} 

Nota cómo ensureInjected se llama antes de unirse a la interfaz de usuario.

Esta es la única situación que sé que garantiza el uso de ensureInjected, pero tal vez me perdí algo.

+0

Sí, también lo entendí pero: estoy usando un archivo css global y funciona bien si utilizo EnsureInjected o no. Este es el misterio que trato de resolver. – user198313

1

Si usa UiBinder, la llamada para garantizar Inyección la proporciona la etiqueta ui: with. Para cualquier otra CSS que esté utilizando en un paquete de clientes (es decir, css heredados excluidos) y que no estén declarados en un archivo ui: with block, debe llamar a ensureInjected explícitamente.

+2

Uso UiBinder exclusivamente, pero para mí no se proporciona ... Tuve que llamarlo de manera explícita. – buc

+0

@buc ​​tienes razón, hice mi comentario más claro. –

8

Como dijo Christian, dentro del archivo UiBinder ui.xml usted no tiene que preocuparse acerca de cómo invocar ensureInjected(), las siguientes sentencias XML hacen el trabajo:

<ui:with field='myStyle' type='com...MyStyle'/> 
<div class='{myStyle.redBorder}'/> 

Por supuesto, esto es suponiendo que hay alguna parte de una interfaz definida MyStyle:

public interface MyStyle { 
    public String redBorder(); 
} 

Ahora estoy de acuerdo w Creo que las cosas se vuelven molestas cuando necesita manipular la extensión CssResourcefuera de de plantillas de UiBinder. Precisamente porque tienes que encargarte de invocar ensureInjected() en alguna parte antes de utilizar la instancia MyStyle con tus widgets.

Yo personalmente uso GIN para inyectar los casos de ampliaciones de CssResource cada vez que necesito them.That manera se puede implementar un proveedor de GIN a medida asegurando que ensureInjected() se llama en la CssResource antes de inyectarlo. Hay tres pasos que hay:

  • crear una interfaz para MyStyle junto con un archivo CSS.
    MyStyle.java

    public interface MyStyle { 
        public String redBorder(); 
    } 
    
  • MyStyle.css

    .redBorder { border: 1px solid red; } 
    
  • exponerlo a través de una extensión ClientBundle.
    Resources.java

    public interface Resources extends ClientBundle { 
        @Source("MyStyle.css") 
        public MyStyle style(); 
    } 
    
  • configurar un método de proveedor de GIN para inyectar las instancias 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; 
        } 
    } 
    

Nos inyectar suavemente la instancia Resources aquí arriba, lo que significa no más problemas de un descriptor de acceso estática llamando GWT.<Resources>create(Resources.class) en cualquier lugar, simplemente todo sucede a través de la inyección de GIN.

Una vez hecho esto, puede inyectar sus instancias de MyStyle cuando las necesite.
Por ejemplo (en algún contexto MVP):

private Widget widget; 

@Inject 
public SomeView(final MyStyle style) { 
    //... 
    widget = uiBinder.createAndBindUi(this); 
    widget.addStyleName(style.redBorder()); 
} 
+0

¿Realmente necesita la anotación '@ Inject' en' createStyle() '? –

+0

¿Debería ClientMOdule.java referirse a 'MyStyle' en lugar de' Style'? –

6

La regla es simple: usted tiene que llamar ensureInjected() explícitamente, a no ser que se está generando la CssResource de un <ui:style> en una plantilla UiBinder (porque la mayoría de las veces no tendrá un mango en el CssResource generado.
Específicamente, <ui:with> proporciona ningún tratamiento especial para CssResource s.

Además, un par de widgets de tomar una específica ClientBundle como argumento para un constructor (como CellTable), llamarán al ensureInjected() en el CssResource que utilizan.

+0

¿Puede ser un poco más específico en 'ui: with'. ¿Se debe invocar para eso o para asegurarInvertir()? –

+0

Porque 'ui: with' no hace nada especial con respecto a' CssResource', significa que, sí, debe llamar 'ensureInjected()' _manually_, explícitamente. –

+0

¿hay alguna forma de que el CssResource se incluya automáticamente cuando se llame desde uiBinder? –

Cuestiones relacionadas