如何在JSF中使用转换器和ajax更新字段
问题描述:
如果值当前为空或空,我基本上会显示两个输入字段。如果不是,我显示一个outputText。这两个值是存储在Long对象中的货币值,我使用转换器正确显示数据(由于我使用PrimeFaces 5.3,因此无法使用PrimeFaces的inputNumber)。我的问题如下:如何在JSF中使用转换器和ajax更新字段
<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>
当我这样说时,转换器引发的消息被显示,但没有任何字段被更新。然而,如果使用相同的布尔变量两个输入/输出选项(改变了1RST数据行中都使用edtVal2
的rendered
属性中使用的变量),如下所示:
<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>
成功的第一个字段的更新和第二次仍然不起作用。
使用转换器来显示格式化的数据是我已经完成的一种解决方法,它的工作方式与预期的一样,我使用的是与以前相同的转换器。但这一次,我不明白为什么它不起作用。
该转换器是重现问题的重要,但任何自定义转换器似乎做这项工作。
答
任何其他解决方案仍然欢迎这个职位,但我设法找到一个有效的解决方案:
当我改变了rendered
属性常量字符串,这个问题是不存在的。所以我认为这个问题来自于误解<c:set>
。
我的解决方案是使用一个bean作为控制器。我将变量从xhtml文件更改为控制器中的属性,现在一切正常。所以我从我的xhtml中删除了所有<c:set>
,并在该页面上使用适当的MVC模式。
注:
对于那些谁不知道什么MVC是:它是明确划分的用户界面和操作数据整齐的架构模式。了解更多信息on wikipedia。
你应该认真改进你的标题...阅读[问],它包含如何写一个好标题的建议。并阅读[mcve]和http://www.stackoverflow.com/tags/jsf/info – Kukeltje
我同意这个问题很长,但它是最小的:我的问题有一个模糊的原因,我试图解决它2小时。我认为这个问题不值得赞成,特别是我尽量准确地提出问题。 – Sirmyself
但是,仍然应该添加一些文本来解释第一个和第二个“panelgrid”之间的差异。现在是人们愿意帮助找到差异,它不是[mcve] ;-) – Kukeltje