2

クリック可能なテーブル ページのリストを表示するタグを含むカスタム コンポーネント ( 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.pagercomponent 属性は、ビュー スコープのバッキング Bean を示しています。このバッキング Bean とそのpages属性currentPageは getter を介して表示され、changePageメソッドは呼び出すアクションです。component 属性は、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デバッグすると、2 つの方法のいずれにも実行が入らないことがわかりました。この問題が に関連しているかどうかはわかりませんがui:repeat、それを除けば、同じメカニズムが他の目的にも機能することがわかります。

なにか提案を?

4

1 に答える 1

2

<ui:repeat>に置き換えてみるといいと思います<c:forEach>

于 2011-12-28T12:58:26.850 に答える