【问题标题】:GXT validation feedbackGXT 验证反馈
【发布时间】:2013-10-21 13:18:05
【问题描述】:

我有一些带有 JSR 303 验证的 POJO,如下所示:

@NotNull
@Size(max = 80)
@Column(name = "trs_name")
private String name;

在应用程序中,我在 GWT 编辑器中使用 GXT FieldLabel 中的 GXT TextField 对其进行渲染。如果验证失败,FieldLabel 会自动显示红波和红旗:

而这正是我所需要的。

但是对于像这样的更复杂的验证:

@Size(min = 1)
private Set<EnumRole> roles;

我创建了一个自定义Editor&lt;Set&lt;Enum&gt;&gt;

public class EnumSetEditor<T extends Enum<T>> extends Composite implements LeafValueEditor<Set<T>> {


  private Map<T, CheckBox> map;

  public EnumSetEditor(Class<T> clazz) {
    FlowPanel panel = new FlowPanel();

    this.map = new HashMap<T, CheckBox>();
    for(T t : clazz.getEnumConstants()) {
      CheckBox cb = new CheckBox();
      cb.setBoxLabel(I18nEnum.i18nEnum(t)); //translates the enum
      panel.add(cb);
      map.put(t, cb);
    }
    this.initWidget(panel);
  }

  @Override
  public void setValue(Set<T> value) {
    for(Map.Entry<T, CheckBox> entry : map.entrySet()) {
      entry.getValue().setValue(value.contains(entry.getKey()));
    }
  }

  @Override
  public Set<T> getValue() {
    Set<T> result = new HashSet<T>();
    for(Map.Entry<T, CheckBox> entry : map.entrySet()) {
      if(entry.getValue().getValue()) {
        result.add(entry.getKey());
      }
    }
    return result;
  }
}

它是这样渲染的:

问题是,即使包装在 GXT FieldLabel 中,如果未选中任何选项,我也没有反馈。因此,验证失败,用户没有反馈。

我以为GXT FieldLabel会自动在编辑器右侧添加红旗,以防验证失败。

  1. 我做错了吗?
  2. 是否有获得此反馈的最佳做法?

【问题讨论】:

    标签: java validation gwt gxt


    【解决方案1】:

    我自己终于找到了解决方案:我相信 FieldLabel 自己处理了反馈,但这是错误的。

    1. 我的类必须实现HasEditorErrors&lt;Set&lt;T&gt;&gt;,以便调用方法void showErrors(List&lt;EditorError&gt; errors)。在这种情况下,我可以做任何我想做的事情:显示一个图标、下划线等。

    2. GXT 中有一个预定义的类来处理图标 + 验证消息:SideErrorHandler

    因此,我修改了这个类:

    public class EnumSetEditor<T extends Enum<T>> extends Composite implements LeafValueEditor<Set<T>>, HasEditorErrors<Set<T>> {
    
      //Added errorHandler attribute
      private SideErrorHandler errorHandler;
    
      public EnumSetEditor(Class<T> clazz) {
    
        ...
        //Initialize the ErrorHandler
        this.errorHandler = new SideErrorHandler(this);
      }
    
      /* 
       * Implemented showErrors(List<EditorError> errors)
       * I only delegate the errors to the ErrorHandler.
       */
    
      @Override
      public void showErrors(List<EditorError> errors) {
        if(errors.isEmpty()) {
          errorHandler.clearInvalid();
        } else {
          errorHandler.markInvalid(errors);
        }
      }
    }
    

    【讨论】:

    • 完全正确 - 标签不管理错误,但字段本身会收到错误。相信我,你不想生活在标签需要知道字段是如何设置的世界里(提示:泛型地狱)......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多