35

所以我找到了一些接近这个的答案,我已经找到了足够的答案来解决我遇到的问题。但即便如此,我还是很想了解这方面的工作原理。让我用一个例子来说明:

我有一个.xhtml看起来像这样(缩短)的 facelet 页面。

<h:form id="resultForm">

    <h:panelGroup class="search_form" layout="block">
        <h:inputText id="lastname" value="#{search.lastname}"/>
        <h:commandButton action="#{search.find}" value="Find">
            <f:ajax execute="lastname" render="resultDisplay"/>
        </h:commandButton>
    </h:panelGroup>

    <h:dataTable value="#{search.searchResults}" var="results" id="resultDisplay"
            rendered="#{!empty search.searchResults}">  
        <h:column>
            #{results.field}
        </h:column>
    </h:dataTable>

</h:form>

现在,为了简洁起见,我不会发布所有的支持 bean 代码,但我有这样的东西:

public void find() {
    searchResults = setResults(true);
}

searchResults一个在哪里ArrayList<Objects>。搜索后,它不为空 - 在多个测试中检查(可以为空,但不是在我正在做的测试中)。

现在。这不起作用。

但是,如果我将dataTable另一个嵌套在里面,比如说panelGroup,它会起作用。

<h:panelGroup id="resultDisplay">
    <h:dataTable value="#{search.searchResults}" var="results"
        rendered="#{!empty search.searchResults}">  
        <h:column>
            #{results.field}
        </h:column>
    </h:dataTable>
</h:panelGroup>

现在,这种变化可以让一切正常工作。我可以接受这个......但我想我也在寻求一些理解。关于为什么我必须嵌套这些组件的任何见解?我肯定错过了一些东西!

4

1 回答 1

67

Ajax 更新由客户端的 JavaScript 语言执行。JavaScript 可以访问的只是 HTML DOM 树。如果 JSF 不向 HTML 输出呈现任何组件,那么 HTML DOM 树中就没有任何东西可以通过 JavaScript 在 Ajax 更新时获得。JavaScript 无法通过其 ID 获取所需的元素。

仅当您将条件 JSF 呈现的组件包装在另一个组件中时,它才会起作用,该组件始终呈现到 HTML 输出,因此始终存在于 HTML DOM 树中,因此始终可以通过 JavaScript 获取。在 ajax 渲染/更新期间引用该包装器组件。

也可以看看:

于 2012-01-25T21:45:35.537 回答