【发布时间】:2012-01-29 04:03:54
【问题描述】:
我开发了一个自定义组件(灵感来自 this article 和 BalusC),其中包含一个显示可点击表格页面列表的 ui:repeat 标签。
在循环块内有一个h:commandLink,它异步调用一个动作,发布一个参数。参数值在每个循环中都会发生变化。这是页面代码:
[...]
<ui:repeat value="#{cc.attrs.pager.pages}" var="loopPage">
<li>
<h:commandLink
action="#{cc.attrs.pager.changePage}"
value="#{loopPage}"
rendered="#{loopPage != cc.attrs.pager.currentPage}"
immediate="true"
>
<f:param name="selectedPage" value="#{loopPage}" />
<f:ajax execute="@this" render="#{cc.attrs.render}" />
</h:commandLink>
<h:outputText
value="#{loopPage}"
rendered="#{loopPage == cc.attrs.pager.currentPage}"
/>
</li>
</ui:repeat>
[...]
现在,cc.attrs.pager 组件属性注意到视图范围的支持 bean,其 pages 和 currentPage 属性通过 getter 可见,changePagemethod 是要调用的操作。 cc.attrs.render 组件属性是每次操作执行后要刷新的目标。这是相关的bean代码:
[...]
private Integer[] pages;
private int currentPage;
[...]
public Integer[] getPages() {
return pages;
}
public int getCurrentPage() {
return currentPage;
}
[...]
public void changePage() {
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance()
.getExternalContext()
.getRequest()
;
String page = request.getParameter("selectedPage");
changePage(Integer.valueOf(page) * rowsPerPage);
}
public void changePage(int firstRow){
this.firstRow = firstRow; //Set the first result to be returned
loadDataList(); // Load requested page.
}
[...]
初始渲染是完美的:所有页面链接都正确显示,并且当前页码未按需要链接。问题显示转到另一个页面:没有任何反应。
尽管h:commandLink 操作与确切的循环参数值一起发布,但响应总是返回相同的页面(第一个)。
调试它,我观察到执行没有进入两个changePage 方法中的任何一个。
我不确定这个问题是否与ui:repeat 有关,但忽略它,我可以看出相同的机制确实适用于其他目的。
有什么建议吗?
【问题讨论】:
标签: jsf-2 foreach composite-component mojarra uirepeat