2011-12-28 63 views
2

我开发了一个自定义组件(灵感来自this article,BalusC),其中包含一个ui:repeat标签,显示可点击表格页面的列表。
在循环块内部有一个h:commandLink,它异步调用一个操作,发布一个参数。参数值在每个循环都会改变。这里的页面代码:带有h:commandLink的JSF 2自定义组件ui:重复

[...] 
<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组件属性指出否则该视图范围的支持豆,其pagescurrentPage属性是通过吸气剂可见,并且changePage方法是调用动作。 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有关,但省略它,我可以告诉相同的机制可以用于其他目的。

有什么建议吗?

回答

2

我想你应该尝试与<c:forEach>

+0

感谢您的答复更换<ui:repeat>。你能解释我为什么要这样做吗? – ruphus 2011-12-28 13:03:15

+0

它工作吗?如果你正在使用莫哈拉,''是越野车。你不应该使用它。 – 2011-12-28 13:06:40

+0

其实我正在使用Mojarra 2.0.6。该错误应该是[这一个](http://java.net/jira/browse/JAVASERVERFACES-1807)。你给的解决方案工作正常。感谢您的支持! – ruphus 2011-12-28 13:41:31