Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html JSF2、Ajax部分更新和ui重复-动态提交和更新添加的文本框_Html_Ajax_Jsf 2_Validation - Fatal编程技术网

Html JSF2、Ajax部分更新和ui重复-动态提交和更新添加的文本框

Html JSF2、Ajax部分更新和ui重复-动态提交和更新添加的文本框,html,ajax,jsf-2,validation,Html,Ajax,Jsf 2,Validation,我有一个JSF2应用程序和一个包含以下代码的页面: <h:inputText id="someInput" required="true" /> <p:outputPanel id="itemsPanel"> <ui:repeat var="i" value="#{myBean.itemIndices}" id="items"> <h:inputText id="itemInput"

我有一个JSF2应用程序和一个包含以下代码的页面:

<h:inputText id="someInput" required="true" />

<p:outputPanel id="itemsPanel">
    <ui:repeat var="i" value="#{myBean.itemIndices}" id="items">
        <h:inputText 
            id="itemInput" 
            value="#{myBean.dataItems[i]}" 
            />
        <h:panelGroup 
            layout="block" 
            styleClass="clear" 
            rendered="#{((i+1) % 10 == 0)}" 
            />
    </ui:repeat>
</p:outputPanel>
<br/>
<p:commandButton
    classStyle="btn" 
    value="Add Row"
    actionListener="#{myBean.increaseItemsCount}" 
    update="itemsPanel" 
    immediate="false"
    ajax="true"
    />


ui:repeat
根据
itemsindexs
dataItems
属性动态呈现数字if文本框。“添加行”按钮调用一种方法,该方法将动态增加
项目索引
数据项
的数量,因此会出现额外的文本输入

如果文本框
someInput
中没有值,则当前代码将不起作用,因为AJAX请求也会验证表单,并且验证失败。在这种情况下,按下按钮没有视觉效果,甚至没有向用户反馈验证未通过(因为我只更新
itemsPanel

如果我将按钮更改为have
immediate=“true”
,则验证问题不再存在。不幸的是,我希望能够恢复用户在添加新行之前可能已更改的动态输入字段的值。
immediate=“true”
属性导致表单不会提交到服务器,因此用户输入的数据不会被持久化

一种可能的解决方案是将
process=“all dynamic input ids csv”
属性添加到命令按钮,并将
immediate
属性设置回
true
。这将导致服务器仅验证流程属性中指定的输入,并且这些输入将被持久化。这里的问题是,这些输入ID是由JSF动态生成的,我无法找到一种合适的方法将它们作为CSV。我也不喜欢在
myBean
中根据JSF如何输出ID的假设来动态生成ID的解决方案


非常感谢您的所有建议。

您可以使用
process=“itemsPanel”



您应该只将命令按钮移动到

是的,很好,Ceburashka BuddyBean的范围是什么?@mmanco查看范围,但这不是我要更改的内容,因为我不需要该bean来保持状态。此外,我不确定bean范围是否与我面临的问题有关。不过,如果您对范围有任何建议,请随时与我们分享。这是可行的,但前提是我将命令按钮放在“项目”面板中。只要在你的回答中提出来,我就接受。谢谢:)我编辑了上面的答案,我只是不知道我可以用别人的帖子来做。@IvayloSlavov我遇到了一个类似的问题。我观察到的是,很奇怪,但基本上组件本身需要提交/处理,以便调用其actionListener。或者,您可以将
@this
添加到Primefaces中的
流程
流程=“itemsPanel,@this”
<p:commandButton
    classStyle="btn" 
    value="Add Row"
    actionListener="#{myBean.increaseItemsCount}" 
    process="itemsPanel" 
    update="itemsPanel" 
    ajax="true"
    />