Отключить проверку бина в случае очистки / сброса формы - PullRequest
3 голосов
/ 26 ноября 2011

CASE: форма содержит вводимый текст для ввода названия отдела (не может быть пустым или пустым) и раскрывающийся список для выбора родительского отдела (может быть пустым), при вводе данных и нажатии clear, метод clear в вспомогательный компонент работает нормально, как и ожидалось, но если не вводить данные и не нажимать кнопку «Очистить», проверка компонента для непустого имени не работает, и появляется сообщение проверки, и я хочу отключить проверку в случае очистки.

  1. Просмотр кода :


    Название отдела:

    <h:outputLabel>Parent Department:</h:outputLabel>
        <ice:selectOneMenu id="parentDepartment" value="#{department.selectedParentDepartment}">               
          <f:selectItem/>
          <f:selectItems value="#{departmentBean.departmentList}" var="dept" 
           itemLabel="#{dept.name}" itemValue="#{dept.id}" />                            
        </ice:selectOneMenu> 
        <h:message for="parentDepartment" style="color:red" />        
    
    <ice:panelGroup>
        <h:commandLink value="Add New" action="#{departmentBean.addOrUpdateDepartment}" />
        <h:commandLink value="Add New" actionListener="#{departmentBean.clear}" />
    </ice:panelGroup>
    

  2. Проверка бинов :

    @NotBlank(message = "{name.required}") @Size(max = 25, message = "{long.value}") @Column(name = "name", length = 25, nullable = false) private String name;

  3. Метод поддерживающих бобов :

    public void clear() { setDepartmentObj(new Department()); setSelectedParentDepartment(0); }

Ответы [ 2 ]

6 голосов
/ 26 ноября 2011

Вместо этого вы можете обновить все представление:

<h:commandLink value="Clear" action="#{bean.clear}" immediate="true" />

с

public String clear() {
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true";
}

immediate="true" пропустит обработку (и проверку) всех компонентов ввода, которые не 'immediate="true".

В качестве альтернативы, фрагмент JavaScript для перезагрузки страницы должен также выполнить:

<h:commandLink value="Clear" onclick="window.location.reload(); return false;" />

Обновление согласно вашим комментариямхотите частичный запрос, затем просто используйте ajax:

<h:commandLink value="Clear" action="#{bean.clear}">
    <f:ajax execute="@this" render="@form" />
</h:commandLink>

с

public void clear() {
    field1 = null;
    field2 = null;
    // ...
}

Поскольку execute имеет значение @this (что, кстати, уже является значением по умолчанию), так что вы можете опустить его), он не будет обрабатывать всю форму.

0 голосов
/ 26 ноября 2011

Некоторые компоненты имеют valueChangeListener.Попробуйте поработать с этим.Однако я не уверен, что это также приведет к валидации.

...