2012-03-23 9 views
5

Ho ottenuto 2 TimeItems, voglio essere in grado di verificare che il valore del secondo elemento non sia più grande del primo.Come creare un validatore personalizzato in smartGWT?

Sono consapevole del fatto che devo ereditare da CustomValidator e inserire la mia logica di convalida in #condition, posso recuperare il valore dell'oggetto convalidato con #getFormItem, ma non ho idea di come passare il valore del primo campo sul validatore

risposta

7

O per una migliore leggibilità e il codice di manutenibilità, utilizzare una classe annidata:

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; 
     } 
    ... 
    } 
} 

E se si preferisce creare i metodi getter per i due oggetti TimeItem per evitare di utilizzare gli attributi privati ​​nella classe annidata.

+0

thx, speravo di avere un validatore separato e riutilizzabile, ma sì posso accedere a entrambi i campi se il validatore è all'interno della stessa classe, che farebbe – javaNoober

+1

Se vuoi una classe separata, basta definire un costruttore con i due oggetti come argomenti: public MyCustomValidator (TimeItem timeItem1, TimeItem timeItem2) e assegna questi due oggetti in due attributi privati ​​di copia che puoi usare nel tuo metodo condition ... – gpapaz

2

non riesci a fare qualcosa di simile:

CustomValidator cv = new CustomValidator() { 

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

quindi impostare validatore TimeItem:

timeItem.setValidators(cv); 

Naturalmente si ca non utilizzare '<' per confrontare i valori dei tuoi TimeItems. Ma convertiti in oggetti temporali e confrontali.

0

So che questo è un vecchio post, ma penso che ci sia una soluzione migliore (almeno nelle versioni più recenti di SmartGWT). Quindi, ecco qui per chiunque sia interessato:

È possibile eseguire il get the whole record utilizzando getRecord(). E poi, è possibile ottenere qualsiasi valore di campo semplicemente interrogando attributi del record:

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; 
    } 
} 

Questo è meglio, perché non è necessario per mantenere i riferimenti ai vostri campi.