【问题标题】:h:dataTable content displayed on .jsf page load,instead of commandLink click onlyh:dataTable 内容显示在 .jsf 页面加载,而不是 commandLink 只点击
【发布时间】:2011-05-11 00:33:54
【问题描述】:

看似简单,但行不通)

加载 .jsf 页面时,会显示来自 DB 的值。
dao impl 块:

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 元素的其他属性才能仅在点击时显示表格内容?

谢谢。

【问题讨论】:

    标签: ajax jsf datatable


    【解决方案1】:

    您需要在初始请求时隐藏数据表,并让命令链接切换一个布尔值,其中数据表的 rendered 属性取决于。

    小面:

    <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;
    }
    

    【讨论】:

    • 是的,我也想到应该使用“渲染”。不幸的是,我遇到了一个错误:“方法必须有签名“字符串方法()”但有签名“无效方法() " 用于 toggleShow 方法调用
    • 又是 Eclipse 和它毫无价值的 EL 验证器吗?只需忽略并运行它。如果它困扰您,请禁用 EL 验证器或根据错误消息修复它并让它返回 null
    • 是的,BalusC,你是对的,它是 Eclipses。收到奇怪的警报:malformedXML:更新期间:j_idt5:未找到产品
    • 用例是:1.加载页面-仅获取链接(没关系);2.单击链接-获取上面的警报;3.单击刷新-获取数据目录内容
    • 也许,应该在页面上加载表格,但隐藏它,因为最初,它根本不存在于页面上
    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多