h:在.jsf页面加载时显示的dataTable内容,而不是仅限命令链接

时间:2010-11-16 19:07:04

标签: ajax jsf datatable

看起来很简单,但不起作用)

加载.jsf页面时,会显示DB中的值 dao impl chunk:

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

}

托管bean块:

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 个答案:

答案 0 :(得分:1)

您需要在初始请求时隐藏数据表,并让commandlink切换一个布尔值,其中数据表的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>

豆:

private boolean show;

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

public boolean isShow() {
    return show;
}

也就是说,在getter中运行昂贵的业务/数据库逻辑并不是最好的做法。在bean的生命中,可以不止一次调用getter。而是在bean的构造函数或@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;
}