2012-04-13 8 views
5

¿Hay alguna forma de obtener el proxy que está editando el editor?Marco de GWT Editor

El flujo de trabajo normal sería:

public class Class implments Editor<Proxy>{ 
    @Path("") 
    @UiField AntoherClass subeditor; 


    void someMethod(){ 
    Proxy proxy = request.create(Proxy.class); 
    driver.save(proxy); 
    driver.edit(proxy,request); 
} 
} 

Ahora bien, si tengo un subeditor del mismo proxy

public class AntoherClass implements Editor<Proxy>{ 
    someMethod(){ 
    // method to get the editing proxy ? 
    } 
} 

Sí sé que sólo puede configurar el proxy para el editor Niño con SetProxy () después de su creación, pero quiero saber si hay algo así como HasRequestContext, pero para el proxy editado.

Esto es útil cuando se utiliza, por ejemplo, ListEditor en objetos no UI.

Gracias.

Respuesta

7

Dos formas en que puede obtener una referencia al objeto en el que está trabajando un editor determinado. En primer lugar, algunos datos simples y un sencillo editor:

public class MyModel { 
    //sub properties... 

} 

public class MyModelEditor implements Editor<MyModel> { 
    // subproperty editors... 

} 

Primero: En lugar de implementar Editor, podemos elegir otra interfaz que se extiende también editor, pero permite subeditores (LeafValueEditor no permite sub-editores). Vamos a tratar ValueAwareEditor:

public class MyModelEditor2 implements ValueAwareEditor<MyModel> { 
    // subproperty editors... 

    // ValueAwareEditor methods: 
    public void setValue(MyModel value) { 
    // This will be called automatically with the current value when 
    // driver.edit is called. 
    } 
    public void flush() { 
    // If you were going to make any changes, do them here, this is called 
    // when the driver flushes. 
    } 
    public void onPropertyChange(String... paths) { 
    // Probably not needed in your case, but allows for some notification 
    // when subproperties are changed - mostly used by RequestFactory so far. 
    } 
    public void setDelegate(EditorDelegate<MyModel> delegate) { 
    // grants access to the delegate, so the property change events can 
    // be requested, among other things. Probably not needed either. 
    } 
} 

Esto requiere que implemente los diversos métodos como en el ejemplo anterior, pero el principal de ellos le interesa será setValue. No necesita invocarlos usted mismo, serán llamados por el conductor y sus delegados. El método flush también es bueno para usar si planea realizar cambios en el objeto; realizar esos cambios antes del enjuague significará que está modificando el objeto fuera del ciclo de vida esperado del controlador, no del otro lado del mundo, pero podría sorprenderlo más tarde .

Segundo: Utilice un SimpleEditor subeditor:

public class MyModelEditor2 implements ValueAwareEditor<MyModel> { 
    // subproperty editors... 

    // one extra sub-property: 
    @Path("")//bound to the MyModel itself 
    SimpleEditor self = SimpleEditor.of(); 

    //... 
} 

uso de este, puede llamar self.getValue() para leer lo que el valor actual es.

Editar: Mirando el AnotherEditor ha implementado, parece que usted está comenzando a hacer algo así como la clase GWT SimpleEditor, aunque es posible que desee otros subeditores así:

ahora si consiguió un subeditor del mismo proxy

public class AntoherClass implements Editor<Proxy>{ 
    someMethod(){ 
    // method to get the editing proxy ? 
    } 
} 

Este subeditor podría implementar ValueAwareEditor<Proxy> en lugar de Editor<Proxy>, y se garantiza que su setValue m ethod se invocará con la instancia de Proxy cuando se inicie la edición.

+0

Sí, funciona, solo necesito implementar ValueAwareEditor y setValue establece el proxy automáticamente. Desde la API "Los editores cuyo comportamiento cambia según el valor que se está editando implementarán esta interfaz". Ese es mi caso. =) –

+0

Gracias a Colin por esta ayuda (especialmente por @Path (""): tuve la tentación de hacer un @Path ("esto") pero eso habría requerido tratamiento especial ...) Ahora me gustaría saber cómo cambiar de un editor a otro dependiendo del valor de los datos. Tengo un cuadro de selección que debería cambiar el formulario (muchos campos comunes pero el diseño y algunos campos aparecen/desaparecen). Tengo un UiBinder para cada tipo, y me gustaría cambiar de uno a otro en la selección del usuario. No me gusta la idea de crearlos todos y hacerlos visibles o no según la situación. Me gustaría crear un nuevo editor y atribuirlo –

2

En su clase de editor hijo, puede implementar otra interfaz TakesValue, puede obtener el proxy de edición en el método setValue.

ValueAwareEditor funciona también, pero tiene todos esos métodos adicionales que realmente no necesita.

Cuestiones relacionadas