【问题标题】:updating datatable using AJAX not working使用 AJAX 更新数据表不起作用
【发布时间】:2013-08-23 20:42:55
【问题描述】:

单击按钮时,我正在检索文件夹中的文件列表。检索文件夹的功能有效,如果我在呈现表之前加载它,则值将按应有的方式显示。但是,如果我尝试使用调用函数初始化值列表的命令按钮填充表,则不会对数据表进行任何更改。这是我的代码:

<h:form id="resultform"> 
    <p:dataTable id="resulttable" value="#{ViewBean.resultList}" var="result">
        <p:column>
            <f:facet name="header">
                <h:outputText value="GFEXP_NOM_BDOC" />
            </f:facet>
            <h:outputText value="#{result.name}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="GFEXP_DATE_MODIF" />
            </f:facet>
            <h:outputText value="#{result.date}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="GFEXP_PATH" />
            </f:facet>
            <h:outputText value="#{result.path}" />
        </p:column>
        <f:facet name="footer">
            <p:commandButton value="REFRESH exploitation" action="#{ViewBean.refresh}" update=":resultform:resulttable" ajax="true" />
        </f:facet>
    </p:dataTable>
</h:form>

这是支持 bean 的代码:

@ManagedBean(name = "ViewBean")
@ViewScoped
public class ViewBean implements Serializable {

    private static final long serialVersionUID = 9079938138666904422L;

    @ManagedProperty(value = "#{LoginBean.database}")
    private String database;

    @ManagedProperty(value = "#{ConfigBean.envMap}")
    private Map<String, String> envMap;

    private List<Result> resultList;

    public void initialize() {
        setResultList(Database.executeSelect(database));

    }

    public void refresh() {
        List<File> fileList = readDirectory();
        List<Result> tmpList = new ArrayList<Result>();
        for (File f : fileList) {
            Result result = new Result(f.getName().substring(0,
                    f.getName().lastIndexOf(".")), String.valueOf(f
                    .lastModified()), f.getPath().substring(0,
                    f.getPath().lastIndexOf("\\") + 1));
            tmpList.add(result);
        }
        setResultList(tmpList);
    }
//GETTERS AND SETTERS

【问题讨论】:

  • 什么 PrimeFaces 版本?
  • 查看是否用PF按钮调用了你的方法
  • Primefaces 3.5。并且正在调用该方法,我添加了一个检查以查看列表的大小,并按应有的方式打印到控制台(并且它不是空的)。
  • 你确定它是 3.5 吗?在 3.4 之前,这是由于无法从 &lt;p:dataTable&gt; 本身内部进行 ajax 更新的错误,特别是 &lt;p:dataTable&gt;。你试过update="@form"吗?如果可行,那么您肯定没有运行 3.5。
  • 我刚试了下,也不行。我很肯定它是 3.5。

标签: ajax jsf primefaces datatable


【解决方案1】:

您似乎在滥用preRenderView 来初始化视图范围bean 的状态。然而,正如它的名字所说,它在视图渲染之前运行。您应该为此使用 @PostConstruct 注释。当放在一个方法上时,该方法将在 bean 的构造和所有托管属性和依赖注入之后被调用。它不会在同一视图上的所有后续回发请求中调用。

@PostConstruct
public void initialize() {
    resultList = Database.executeSelect(database);
}

不要忘记完全删除&lt;f:event&gt;。

另见:

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多