JSF commandButton с немедленным = "истина" - PullRequest
6 голосов
/ 06 марта 2009

У меня есть ситуация, когда существует selectOneMenu, значение которого связано с компонентом поддержки.

Мне нужна кнопка, которая не обновляет значения модели (поэтому она имеет свойство немедленное = "true").

Метод действия этой кнопки изменяет значение, с которым связано selectOneMenu, но при повторном отображении страницы отображается исходное значение (то, которое было отправлено), а не то, которое установлено в методе действия.

Есть идеи, почему это происходит?

Если я не достаточно хорошо объяснил проблему, пожалуйста, дайте мне знать.

<ч /> РЕДАКТИРОВАТЬ: Как и было запрошено, вот исходный код:

код страницы:

<h:selectOneMenu id="selectedPerson" 
                 binding="#{bindings.selectPersonComponent}" 
                 value="#{bean.selectedPerson}">
   <s:selectItems var="op" value="#{bean.allPersons}" 
                  label="#{op.osoba.ime} #{op.osoba.prezime}" 
                  noSelectionLabel="#{messages.selectAPerson}">
   </s:selectItems>
   <f:converter converterId="unmanagedEntityConverter" />
</h:selectOneMenu>
...
<a4j:commandButton action="#{bean.createNew}" value="#{messages.createNew}"
     immediate="true" reRender="panelImovine">
</a4j:commandButton>

код Java:

private Person selectedPerson;

public String createNew() {
    log.debug("New created...");
    selectedPerson = null;
    bindings.getSelectPersonComponent().setSubmittedValue(null); //SOLUTION
    return "";
}

Решение в подкладке с пометкой РЕШЕНИЕ :)

Ответы [ 3 ]

7 голосов
/ 06 марта 2009

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

Причина проблемы подробно объясняется здесь: ClearInputComponents

Проблема (как объяснено) в том, что значения модели не были обновлены, поэтому отправленные входные данные все еще находятся в поле component.submittedValue, и это поле отображается, если оно не пустое. После обновления модели он обычно очищается.

Первое решение не сработало в моем случае, потому что в представлении есть другое важное состояние, которое не должно быть потеряно. Но второе решение отлично сработало:

component.setSubmittedValue(null);

И это было все, что было нужно: это небольшая дополнительная работа, потому что компоненты должны быть привязаны к некоторому компоненту, но не так уж и плохо.

1 голос
/ 12 марта 2009

Чтобы продолжить, я не думаю, что вам нужно связывать компонент с компонентом. Вы можете просто получить компонент из FacesContext экземпляра через UIViewRoot, если вы знаете идентификатор клиента компонента.

Это будет выглядеть примерно так:

Foo component = (Foo)FacesContext.getCurrentInstance().getViewRoot().getComponent(clientId);

Где Foo - это класс компонента, который вы используете, а clientId - это идентификатор клиента компонента в формате "formId: elementId", который использует JSF.

0 голосов
/ 03 сентября 2014

Для меня это сработало:

@ManagedBean(name = "bean")
@ViewScoped
public class Bean {
    private SelectOneMenu component;

    public SelectOneMenu getComponent() {
        return selectComponent;
    }

    public void setComponent(SelectOneMenu component) {
        this.Component = component;
    }
    public void resetComponent() {
        component.resetValue();
    }
    ...
}
<h:selectOneRadio value="#{bean.value}" id = "idRadio" required="true" requiredMessage = "Required Message" binding="#{bean.component}" >
    <f:selectItem itemLabel="Value 1" itemValue="value1"/>
    <f:selectItem itemLabel="Value 2" itemValue="value2" />     
</h:selectOneRadio>

<primefaces:commandButton action="#{bean.resetComponent}" value="Erase" update="idRadio" immediate="true"/>
...

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...