2 Взаимоисключающие InputComponents Ссылка на одно и то же поле обновляет одно и то же поле дважды - PullRequest
1 голос
/ 07 июня 2011

У меня есть экран с 2 JSF Input Components: inputText и inputText with suggestionBox.Они оба связаны с одним и тем же полем , но только одно может быть видимым / визуализированным (взаимное исключение).
Дело в том, что если я что-то напишу в одном, а затем отправлю, другой компонент , который не отображается, обновляет модель (снова обновляется то же поле) с , этозначение (которое пустая строка или ноль).Чтобы обойти это, я создал другое поле в своем классе, чтобы 2 компонента не ссылались на одно и то же поле.
Мне это не нравится, потому что я изменяю свою модель, чтобы решить проблему с графическим интерфейсом.

Как я могу иметь 2 взаимоисключающих компонента ввода, ссылающихся на одно и то же значение, работающее так, как я хочу?

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Ключ заключается в использовании атрибута рендеринга для отображения / скрытия компонентов, так что только один или другой фактически обновляет модель за раз. Вот очень простой пример для иллюстрации:

<h:form id="exampleForm" prependId="false">

    <h:inputText id="test1" value="#{exampleBean.testString}" rendered="#{exampleBean.toggle}" style="border: 1px solid red;" />
    <h:inputText id="test2" value="#{exampleBean.testString}" rendered="#{!exampleBean.toggle}" style="border: 1px solid blue;" />

    <h:commandButton id="testButton" action="#{exampleBean.toggle()}" />

</h:form>

и пример компонента с общим свойством testString:

@ManagedBean(name = "exampleBean")
@ViewScoped
public class ExampleBean {

    private String testString;

    public String getTestString() { return testString; }

    public void setTestString(String testString) { 
        this.testString = testString; 
        System.out.println(testString);
    }

    private boolean toggle;

    public boolean isToggle() { return toggle; }
    public void setToggle(boolean toggle) { this.toggle = toggle; }

    public void toggle() {
        toggle = (toggle) ? false : true;
    }

}
0 голосов
/ 12 июня 2011

Как я уже говорил, я не могу использовать рендеринг, поэтому в этом случае использование readonly true с visible false дает мне поведение, которое мне нужно.Спасибо.

...