我需要点击一个panelGrid
(一个从对象列表中填充的人),然后将与之关联的项目发送到辅助bean。
我的HTML适用于:
<ui:repeat var="searchItem" value="#{bean.filteredSearchItems}" varStatus="searchResult">
<h:panelGrid>
<!-- I get some info here from the searchResult object -->
</h:panelGrid>
<f:ajax event="click" listener="{bean.clickFlight}" />
<f:param name="lfi" value="#{searchResult.index}" />
</ui:repeat>
我知道(在我的支持bean中)我需要一个可以处理ajax调用的函数clickSearchItem()
,所以为了测试所有这些,我在我的支持bean中做了以下事情:
public void clickFlight()
{
HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String lfi = req.getParameter("lfi");
if (lfi == null)
log.info("LFI WAS RETURNED AS NULL :(");
log.info("HOPEFULLY AN INDEX OF SOME SORT!: " + lfi);
}
没有记录任何内容 - 点击不会注册。有没有其他人有这个问题?有谁知道如何解决它?
答案 0 :(得分:3)
<f:ajax>
需要嵌套到实现ClientBehaviorHolder
的组件中。如果您打算使用<h:panelGrid>
(生成HTML <table>
),那么您应该将<f:ajax>
嵌套在组件本身中。
<h:panelGrid>
<f:ajax event="click" listener="{bean.clickFlight}" />
<!-- I get some info here from the searchResult object -->
</h:panelGrid>
<f:param>
仅由<h:outputFormat>
和<h:commandXxx>
的渲染器识别。如果您的目标是Servlet 3.0兼容容器(Tomcat 7,Glassfish 3,JBoss 6/7等),因此支持EL 2.2,那么您可以将其作为方法参数传递:
<h:panelGrid>
<f:ajax event="click" listener="{bean.clickFlight(searchResult.index)}" />
<!-- I get some info here from the searchResult object -->
</h:panelGrid>
如果愿意,你甚至可以传递整个对象:
<h:panelGrid>
<f:ajax event="click" listener="{bean.clickFlight(searchResult)}" />
<!-- I get some info here from the searchResult object -->
</h:panelGrid>
另一种方法是,如果您自己需要<f:param>
,则可以使用<h:commandLink>
代替。
<h:commandLink>
<f:ajax event="click" listener="{bean.clickFlight(searchResult)}" />
<f:param name="lfi" value="#{searchResult.index}" />
<h:panelGroup>
<!-- I get some info here from the searchResult object -->
</h:panelGroup>
</h:commandLink>