2012-03-23 25 views
5

Tengo 2 TimeItems, quiero poder validar que el valor del segundo elemento no es más grande que el primero.¿Cómo crear un validador personalizado en smartGWT?

Soy consciente de que debo heredar de CustomValidator y colocar mi lógica de validación en #condition, puedo recuperar el valor del elemento validado con #getFormItem, pero no tengo idea de cómo pasar el valor de la primera campo en el validador

Respuesta

7

O para una mejor legibilidad y mantenibilidad del código, utilice una clase anidada:

class YourClass { 
    private TimeItem timeItem1; 
    private TimeItem timeItem2; 

    public YourClass() { 
     //Instantiate your TimeItem objects. 
     ... 

     //Set the validator 
     MyCustomValidator validator = new MyCustomValidator(); 
     timeItem1.setValidators(validator); 

     /Assuming that both items should check validation. 
     timeItem2.setValidators(validator); 
    } 

    ... 
    class MyCustomValidator extends CustomValidator { 

     @Override 
     protected boolean condition(Object value) { 
      //Validate the value of timeItem1 vs the timeItem2 
      //Overide equals or transform values to 
      if (timeItem1.getValueAsString().equals(timeItem2.getValueAsString()) { 

      //Return true or false. 
      } 
      return false; 
     } 
    ... 
    } 
} 

Y si prefiere crear métodos de acceso para los dos objetos TimeItem a evitar el uso de atributos particulares en su clase anidada.

+0

thx, esperaba tener un validador por separado y reutilizable, pero sí puedo acceder a ambos campos si el validador está dentro de la misma clase, que haría – javaNoober

+1

Si desea una clase separada, simplemente defina un constructor con los dos objetos como sus argumentos: public MyCustomValidator (TimeItem timeItem1, TimeItem timeItem2), y asigne estos dos objetos en dos atributos privados de copia que puede usar en su método de condición ... – gpapaz

2

¿no puedes hacer algo como:

CustomValidator cv = new CustomValidator() { 

     @Override 
     protected boolean condition(Object value) { 
      if (otherTimeItem.getValue()<value){ 
       return true; 
      }else 
       return false; 
      } 
     } 
}; 

continuación, establece validador TimeItem:

timeItem.setValidators(cv); 

Por supuesto que ca no use '<' para comparar los valores de sus TimeItems. Pero conviértelos en objetos de tiempo y compáralos.

0

Sé que esta es una publicación anterior, pero creo que hay una solución mejor (al menos en las versiones más recientes de SmartGWT). Así que aquí va para cualquier persona interesada:

Puede get the whole record siendo validado utilizando getRecord(). Y luego, se puede conseguir cualquier valor de campo con sólo consultar los atributos del registro:

CustomValidator validator = new CustomValidator() { 
    @Override 
    protected boolean condition(Object rawValue) { 
     Record validatedRecord = getRecord(); 
     String field1 = validatedRecord.getAttribute(FIELD1_NAME); 
     String field2 = validatedRecord.getAttribute(FIELD2_NAME); 

     return field2 <= field1; 
    } 
} 

Esto es mejor, ya que no es necesario para mantener las referencias a sus campos.

Cuestiones relacionadas