使用以下代码,我得到一个我无法解释的行为。
自动填充方法可以很好地选择对象。 它会按预期更新下面的面板。
然后两个按钮(New Airport,Save Airport)没有触发支持bean监听器。 但是,如果我使用自动完成功能点击之前的按钮之一来加载对象,则会触发侦听器。
<h:form id="arptForm">
<p:autoComplete minQueryLength="3"
value="#{airportHandler.theAirportNames}" effect="fade"
completeMethod="#{airportHandler.autoComplete}"
forceSelection="true" converter="airportNamesConverter"
var="airport" itemLabel="#{airport.icaoName}" itemValue="#{airport}"
maxResults="#{airportHandler.maxAutoCompleteResults}">
<f:ajax event="itemSelect"
listener="#{airportHandler.airportChanged}" render="@form" />
<p:column style="width:80%">
<h:outputText
value="#{airport.icaoName} - #{airport.iataName} - #{airport.airportName} (#{airport.cityName})" />
</p:column>
</p:autoComplete>
<p:spacer width="20" height="20" />
<p:commandButton id="newAirport" value="New Airport"
icon="ui-icon-newwin" actionListener="#{airportHandler.newAirport}"
update="@form" />
<p:spacer width="20" height="20" />
<p:commandButton id="saveAirport" value="Save Airport"
icon="ui-icon-newwin" actionListener="#{airportHandler.saveAirport}"/>
<p:separator />
<p:outputPanel id="allArptData">
<p:panel id="airportBasics" header="Airport Basics"
toggleable="true" toggleSpeed="500"
rendered="#{airportHandler.theAirport != null}">
<ui:include src="airportbasics.xhtml" />
</p:panel>
<p:panel id="airportRunways" header="Airport Runways"
toggleable="true" toggleSpeed="500"
rendered="#{airportHandler.theAirport != null}">
<ui:include src="airportrunways.xhtml" />
</p:panel>
</p:outputPanel>
</h:form>
你能解释一下会发生什么吗? 感谢
答案 0 :(得分:0)
正如你所说,你不应该形成不正确的巢形式。此外,当您将所有内容放在一个主form
内时,这意味着您在提交该表单时混合了这些进程。每个页面可以有很多表单,如自动填充表单或个人资料信息表单等。
当你做某事。关于自动填充实际上你想提交关于自动完成的东西而不是关于其他按钮,所以只需将它们分开。这并不意味着您应该为每个组件创建表单,而只是将页面分成主要部分。