2012-03-23 87 views
5

我得到了2个TimeItems,我希望能够验证第二项的值不会比第一项大。如何在smartGWT中创建自定义验证器?

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

回答

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方法。

+0

thx,希望能有一个单独的,可重用的验证器,但是如果验证器在同一个类中,我可以访问这两个字段,那样做 – javaNoober 2012-03-25 23:36:30

+1

如果你想要一个单独的类,只需定义一个具有两个对象的构造函数作为它的参数:public MyCustomValidator(TimeItem timeItem1,TimeItem timeItem2),并将这两个对象分配给两个可以在条件方法中使用的私有属性... – gpapaz 2012-03-26 00:00:32

2

你能不能做这样的事情:

CustomValidator cv = new CustomValidator() { 

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

然后设置TimeItem验证:

timeItem.setValidators(cv); 

当然你CA不使用'<'来比较您的TimeItems的值。但转换为时间对象并进行比较。

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

这是更好,因为你并不需要保存引用您的域。

相关问题