Forms 表单中的JSF按钮有时不';不采取行动

Forms 表单中的JSF按钮有时不';不采取行动,forms,jsf,jsf-2,primefaces,Forms,Jsf,Jsf 2,Primefaces,我在组织表格方面有问题。当我制作一个表单时,一些按钮(或进行ajax调用的任何其他组件)不执行操作,但它们执行更新。当我将表单拆分为两个新表单时,按钮开始工作 在这种情况下,按钮和自动完成不起作用 <h:form styleClass="question-#{cc.attrs.question.id}"> ... <p:commandButton value="add answer" update="@form" action="#{questionEdito

我在组织表格方面有问题。当我制作一个表单时,一些按钮(或进行ajax调用的任何其他组件)不执行操作,但它们执行更新。当我将表单拆分为两个新表单时,按钮开始工作

在这种情况下,按钮和自动完成不起作用

<h:form styleClass="question-#{cc.attrs.question.id}">
    ...

    <p:commandButton value="add answer" update="@form" action="#{questionEditorBean.addAnswer}" />
    <p:commandButton value="save" update="@(.question-#{cc.attrs.question.id})" action="#{cc.attrs.onSave}" oncomplete="#{cc.attrs.onCancel}" />
    <p:commandButton value="cancel" onclick="#{cc.attrs.onCancel}" />

    <p:autoComplete value="#{questionEditorBean.newTag}" id="tagSelect" completeMethod="#{tagBean.completeTag}" dropdown="true"  
                var="t" itemLabel="#{t.name}" itemValue="#{t}" converter="#{tagConverter}" forceSelection="true">
    <p:ajax event="itemSelect" action="#{action}" update="@form"/>
</p:autoComplete>
</h:form>

...
当我拆分表单时,一切都正常

<h:form styleClass="question-#{cc.attrs.question.id}">
    ...

    <p:commandButton value="add answer" update="@form" action="#{questionEditorBean.addAnswer}" />
    <p:commandButton value="save" update="@(.question-#{cc.attrs.question.id})" action="#{cc.attrs.onSave}" oncomplete="#{cc.attrs.onCancel}" />
    <p:commandButton value="cancel" onclick="#{cc.attrs.onCancel}" />

</h:form>
<h:form>

    <p:autoComplete value="#{questionEditorBean.newTag}" id="tagSelect" completeMethod="#{tagBean.completeTag}" dropdown="true"  
                var="t" itemLabel="#{t.name}" itemValue="#{t}" converter="#{tagConverter}" forceSelection="true">
    <p:ajax event="itemSelect" action="#{action}" update="@form"/>
</p:autoComplete>
</h:form>

...

我没有嵌套表单。我一直在努力解决这个问题。我不理解这种行为,我不想把按钮和组件分割成更多的形式,因为它们应该在概念上结合在一起。有解决方案吗?

您可以尝试为表单提供一个
id
并设置
prependId=“false”
,如本例所示:

<h:form id="ccForm" prependId="false">
通过这种方式,您可以明确复合组件中的
update
目标是什么

我还注意到,您试图在表单中使用
styleClass
作为
id
,并试图对其进行更新。按照我建议的方法,将其
update
属性如下所示:

<p:commandButton value="save" update="ccForm:question-#{cc.attrs.question.id}" action="#{cc.attrs.onSave}" oncomplete="#{cc.attrs.onCancel}" />


我希望它能有所帮助。

我使用styleClass是因为我希望页面上所有包含此类的组件都能更新。我会使用name属性,但JSF不允许。那么,在没有任何警告的情况下不在服务器上调用该操作,而是更新更新中的元素,这是正常行为吗?我希望能找到一些解决方案,使它能够与一个表单一起工作。
cc.attrs.onCancel
是bean中的方法还是表示客户端js函数的文本?它是JavaScript。关闭对话框。你的什么动作在单一形式下不起作用?在第二个例子中,所有动作都起作用。在第一种情况下,按钮不调用服务器上的操作,而是调用update和oncomplete。这是非常奇怪的,因为唯一的区别是分离成两种形式。在第二个例子中,一切都有效。在第一种情况下,按钮不调用服务器上的操作,而是调用update和oncomplete。这很奇怪,因为唯一的区别是分离成两种形式。在第一种情况下,当我删除自动完成时,按钮开始工作。我在很多地方都遇到了这个问题,不仅是按钮和自动完成,而且只有按钮。
<p:commandButton value="save" update="ccForm:question-#{cc.attrs.question.id}" action="#{cc.attrs.onSave}" oncomplete="#{cc.attrs.onCancel}" />