Как создать собственный валидатор в smartGWT? - PullRequest
5 голосов
/ 23 марта 2012

У меня есть 2 TimeItems, я хочу иметь возможность проверить, что значение второго элемента не больше первого.

Мне известно, что я должен наследовать от CustomValidator и поместить свою логику проверки в #condition, я могу получить значение проверенного элемента с помощью #getFormItem, но я не знаю, как передать значение первого поля на валидатор

Ответы [ 3 ]

7 голосов
/ 23 марта 2012

Или для лучшей читабельности и удобства сопровождения кода используйте вложенный класс:

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

И если вы предпочитаете создавать методы получения для двух объектов TimeItem, чтобы избежать использования личных атрибутов во вложенном классе.

2 голосов
/ 23 марта 2012

Разве вы не можете сделать что-то вроде:

CustomValidator cv = new CustomValidator() {

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

Затем установите валидатор TimeItem:

timeItem.setValidators(cv);

Конечно, вы не можете использовать '<' для сравнения значений ваших TimeItems. Но конвертируйте в объекты времени и сравните их. </p>

0 голосов
/ 10 сентября 2016

Я знаю, что это старый пост, но я думаю, что есть лучшее решение (по крайней мере, в более поздних версиях SmartGWT). Так что здесь это для всех, кто заинтересован:

Вы можете получить всю запись , проверяемую с помощью getRecord(). И затем, вы можете получить любое значение поля, просто запросив атрибуты записи:

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

Это лучше, потому что вам не нужно хранить ссылки на ваши поля.

...