h: содержимое dataTable, отображаемое при загрузке страницы .jsf, вместо нажатия только ссылки CommandLink - PullRequest
2 голосов
/ 16 ноября 2010

выглядит просто, но не работает)

При загрузке страницы .jsf отображаются значения из БД.
дао импл чанк:

public List<Product> getProducts() {
    return getHibernateTemplate().find("from Product");

}

кусок управляемого боба:

public List<Product> getProducts() {
    return this.getProductManager().getProducts();
}

Я намеревался, что f:ajax делает эту работу только по клику:

         <h:form>

            <h:commandLink value="show" action="nothing">
                <f:ajax render="pr"/>
            </h:commandLink>


            <h:dataTable var="product" id="pr" value="#{showProducts.products}">
                  <h:column>#{product.name}</h:column>
            </h:dataTable>

         </h:form>

И данные видны на странице, когда она загружена. С помощью Firebug я вижу, что данные обновляются одним щелчком мыши, поэтому ajax работает.

Нужны ли дополнительные атрибуты для элемента h:dataTable, чтобы содержимое таблицы отображалось только при нажатии?

Спасибо.

1 Ответ

1 голос
/ 16 ноября 2010

Вам нужно скрыть таблицу данных при первоначальном запросе и позволить командной ссылке переключать логическое значение, в котором атрибут rendered таблицы данных зависит от.

Facelets:

<h:form>
    <h:commandLink value="show" action="#{showProducts.toggleShow}">
        <f:ajax render="products"/>
    </h:commandLink>
    <h:panelGroup id="products">
        <h:dataTable var="product" value="#{showProducts.products}" rendered="#{!showProducts.show}">
            <h:column>#{product.name}</h:column>
        </h:dataTable>
    </h:panelGroup>
</h:form>

Bean:

private boolean show;

public void toggleShow() {
    show = !show; // Or just show = true;
}

public boolean isShow() {
    return show;
}

Тем не менее, не рекомендуется использовать дорогостоящую бизнес-логику / базу данных внутри геттера. Получатель может быть вызван более одного раза в жизни бина. Скорее выполняйте эту работу в конструкторе компонента или в методе @PostConstruct.

private List<Product> products;

@PostConstruct
public void init() {
    products = this.getProductManager().getProducts();
}

public List<Product> getProducts() {
    return products;
}

Или, если на самом деле его нужно загружать лениво, лучше сделать это:

private List<Product> products;

public List<Product> getProducts() {
    if (products == null) {
        products = this.getProductManager().getProducts();
    }
    return products;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...