如何在smartGWT中创建自定义验证器?

时间:2012-03-23 10:01:13

标签: smartgwt

我有2个TimeItems,我希望能够验证第二个项目的值不大于第一个项目。

我知道我必须从CustomValidator继承并将我的验证逻辑放在#condition中,我可以使用#getFormItem检索已验证项的值,但我不知道如何传递第一个字段的值到验证器上

3 个答案:

答案 0 :(得分:7)

或者为了更好的可读性和代码可维护性,请使用嵌套类:

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对象创建getter方法,以避免在嵌套类中使用私有属性。

答案 1 :(得分:2)

你不能做类似的事情:

CustomValidator cv = new CustomValidator() {

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

然后设置TimeItem验证器:

timeItem.setValidators(cv);

当然你不能用'&lt;'比较TimeItems的值。但转换为时间对象并进行比较。

答案 2 :(得分:0)

我知道这是一个老帖子,但我认为有一个更好的解决方案(至少在更新版本的SmartGWT中)。所以对于任何感兴趣的人来说都是如此:

您可以使用getRecord()get the whole 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;
    }
}

这样做更好,因为您不需要保留对字段的引用。