2012-03-23 12 views
5

Tôi nhận được 2 TimeItems, tôi muốn có thể xác thực rằng giá trị của mục thứ hai không lớn hơn giá trị đầu tiên.Làm cách nào để tạo trình xác thực tùy chỉnh trong smartGWT?

Tôi biết rằng tôi phải kế thừa từ CustomValidator và đặt logic xác thực của tôi trong #condition, tôi có thể truy xuất giá trị của mục được xác thực bằng #getFormItem, nhưng tôi không biết cách chuyển giá trị của giá trị đầu tiên lĩnh vực vào validator

Trả lời

7

Hoặc để có thể đọc tốt hơn và khả năng bảo trì mã, sử dụng một lớp lồng nhau:

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

Và nếu bạn thích tạo ra các phương pháp getter cho hai đối tượng TimeItem để tránh sử dụng các thuộc tính riêng trong lớp lồng nhau của bạn.

+0

thx, hy vọng có trình xác nhận riêng và có thể tái sử dụng, nhưng có tôi có thể truy cập cả hai trường nếu trình xác thực nằm trong cùng một lớp, sẽ làm – javaNoober

+1

Nếu bạn muốn một lớp riêng biệt, chỉ cần định nghĩa một hàm tạo với hai đối tượng như đối số của nó: public MyCustomValidator (TimeItem timeItem1, TimeItem timeItem2), và gán hai đối tượng này trong hai thuộc tính riêng tư sao chép mà bạn có thể sử dụng trong phương thức điều kiện của bạn ... – gpapaz

2

có thể bạn không làm điều gì đó như:

CustomValidator cv = new CustomValidator() { 

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

Sau đó thiết lập bạn validator TimeItem:

timeItem.setValidators(cv); 

Tất nhiên bạn ca không sử dụng '<' để so sánh các giá trị của TimeItems của bạn. Nhưng chuyển đổi thành đối tượng thời gian và so sánh chúng.

0

Tôi biết đây là một bài đăng cũ, nhưng tôi nghĩ rằng có một giải pháp tốt hơn (ít nhất là trong các phiên bản gần đây của SmartGWT). Vì vậy, ở đây nó dành cho bất kỳ ai quan tâm:

Bạn có thể get the whole record được xác thực bằng cách sử dụng getRecord(). Và sau đó, bạn có thể nhận bất kỳ giá trị trường nào bằng cách chỉ truy vấn thuộc tính của bản ghi:

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

Điều này là tốt hơn vì bạn không cần phải tham chiếu đến trường của mình.