Пользовательский компонент JSF 2 с h: commandLink внутри ui: repeat - PullRequest
2 голосов
/ 28 декабря 2011

Я разработал пользовательский компонент (вдохновленный этой статьей от 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 не замечает иначе, что базовый компонент видовой области, чьи атрибуты pages и currentPage видны через геттеры, и changePage метод - это действие для вызова.Атрибут компонента cc.attrs.render - это цель, которая должна обновляться после каждого выполнения действия.Вот соответствующий код компонента:

[...]

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, но, опуская ее, я могу сказать, что этот же механизм работает и для других целей.

Есть предложения?

1 Ответ

2 голосов
/ 28 декабря 2011

Я думаю, вы должны попробовать заменить <ui:repeat> на <c:forEach>

...