【问题标题】:How to update a field using a converter and ajax in JSF如何在 JSF 中使用转换器和 ajax 更新字段
【发布时间】:2017-10-05 20:35:57
【问题描述】:

如果值当前为空或 null,我基本上会显示两个输入字段。如果不是,我会显示一个 outputText。这两个值是存储在 Long 对象中的货币值,我使用转换器正确显示数据(我不能使用 PrimeFaces 的 inputNumber,因为我使用的是 PrimeFaces 5.3)。我的问题如下:

<c:set var="edtVal1" value="#{bean.val1 ne null and bean.val1 ne 0}" scope="request" />
<c:set var="edtVal2" value="#{bean.val2 ne null and bean.val2 ne 0}" scope="request" />

<p:panelGrid>
    <p:row>
        <p:column colspan="2">
            <p:messages id="mainMessages" globalOnly="false" autoUpdate="true" showDetail="true" />
        </p:column>
    </p:row>
    <!-- [...] -->

    <p:row>
        <p:column styleClass="col-quarter col-label2">
            <h:outputText value="value 1" />
        </p:column>
        <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}">
            <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" />
        </p:column>
        <p:column styleClass="col-quarter" rendered="#{not edtVal1}">
            <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter">
                <p:ajax update="mainMessages val1Input" event="change" />
            </p:inputText>
        </p:column>
    </p:row>
    <p:row>
        <p:column styleClass="col-quarter col-label2">
            <h:outputText value="value 2" />
        </p:column>
        <p:column styleClass="col-quarter col-value2" rendered="#{edtVal2}">
            <h:outputText id="val1Output" value="#{bean.val2}" converter="myConverter" />
        </p:column>
        <p:column styleClass="col-quarter" rendered="#{not edtVal2}">
            <p:inputText id="val1Input" value="#{bean.val2}" converter="myConverter">
                <p:ajax update="mainMessages val1Input" event="change" />
            </p:inputText>
        </p:column>
    </p:row>
</p:panelGrid>

当我这样说时,转换器抛出的消息被显示,但没有任何字段被更新。但是,如果我对两个输入/输出选项使用相同的布尔变量(将第一个数据行的rendered 属性中使用的变量更改为在两者中都使用edtVal2),如下所示:

<p:row>
    <p:column styleClass="col-quarter col-label2">
        <h:outputText value="value 1" />
    </p:column>
    <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}">
        <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" />
    </p:column>
    <p:column styleClass="col-quarter" rendered="#{not edtVal1}">
        <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter">
            <p:ajax update="mainMessages val1Input" event="change" />
        </p:inputText>
    </p:column>
</p:row>

第一个字段更新成功,第二个字段仍然无效。

使用转换器显示格式化数据是我已经完成的一种解决方法,它可以按预期工作,并且我使用与以前相同的转换器。但这一次,我不明白为什么它不起作用。

转换器对于重现问题很重要,但任何自定义转换器似乎都可以完成这项工作。

【问题讨论】:

  • 你应该认真改进你的标题...阅读How to Ask,它包含关于如何写一个好的标题的建议。并阅读minimal reproducible examplestackoverflow.com/tags/jsf/info
  • 我同意这个问题很长,但它是最小的:我的问题有一个模糊的原因,我试图解决它 2 小时。我认为这个问题不值得一票否决,尤其是在我努力尽可能准确地提出问题的情况下。
  • 但是,您仍然应该添加一些文本来解释第一个和第二个“panelgrid”之间的区别。现在取决于愿意帮助找到差异的人,而不是minimal reproducible example ;-)
  • 我是否需要删除转换器代码才能最小化?
  • 如果您不需要转换器有同样的问题,您可以将其删除。但它也需要是完整的、可验证的……创建一个空的jsf项目。复制/粘贴您在上面发布的内容。它运行吗?另请阅读stackoverflow.com/tags/jsf/info

标签: jsf primefaces xhtml converter


【解决方案1】:

这篇文章仍然欢迎任何其他解决方案,但我设法找到了一个可行的解决方案:

当我将rendered 属性更改为常量字符串时,问题不存在。所以我认为问题出在对&lt;c:set&gt;的误解。

我的解决方案是使用 bean 作为控制器。我将变量从 xhtml 文件更改为控制器中的属性,现在一切正常。所以我从我的 xhtml 中删除了所有 &lt;c:set&gt; 并现在在该页面上使用正确的 MVC 模式。


注意:
对于那些不知道 MVC 是什么的人:它是一种简洁的架构模式,可以清楚地划分用户界面和操作数据。了解更多on wikipedia

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 2012-12-16
    • 2012-12-17
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2011-06-07
    • 2018-12-27
    相关资源
    最近更新 更多