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.
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. =) –
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 –