2 个互斥的InputComponents 引用相同的Field 则更新相同的字段两次

发布于 2024-11-14 03:23:03 字数 427 浏览 2 评论 0原文

我有一个带有 2 JSF 输入组件 的屏幕:inputTextinputText with suggestBox。它们都绑定到同一字段,但只有一个可以可见/渲染(互斥)。
问题是,如果我在其中写一些内容然后提交,则另一个未显示的组件正在更新模型(同一字段再次更新)使用它的值(这是空字符串或null)。为了解决这个问题,我在类中创建了另一个字段,以便这两个组件不会引用同一字段。
我不喜欢这样,因为我正在改变我的模型来解决 GUI 问题。

我怎样才能有2个互斥的输入 引用相同值的组件 按照我想要的方式工作?

I have a screen with 2 JSF Input Components: inputText and inputText with suggestionBox. They are both bound to the same field, but only one can be visible/rendered (mutual exclusion).
The thing is that if I write something in one and then submit, the other component which is not displayed is updating the model (the same field is updated again) with it's value (which is empty string or null). To work around this I created another field in my Class, so that the 2 components don't refer to the same field.
I don't like this, because I'm altering my model to solve a GUI problem.

How can I have 2 mutually exclusive input
components referring the same value
working as I want ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

嗳卜坏 2024-11-21 03:23:03

关键是使用渲染属性来显示/隐藏组件,以便一次只有一个或另一个实际更新模型。这是一个非常基本的示例来说明:

<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 的示例 bean:

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

}

The key is to use the rendered attribute to show/hide the components so that only one or the other is actually updating the model at a time. Here is a very basic example to illustrate:

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

and the example bean with shared property 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;
    }

}
时光磨忆 2024-11-21 03:23:03

正如我所说,我无法使用渲染,因此在这种情况下,使用 readonly truevisible false 可以提供我需要的行为。谢谢。

As I stated I can't use rendered, so in this case using readonly true with visible false gives me the behavior I need. Thanks.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文