当我想要ajax-update时,为什么我需要在另一个组件中嵌入一个带有render ="#{some}"的组件?

blo*_*p3r 32 jsf facelets jsf-2 conditional-rendering ajax-update

所以我找到了一些接近这个的答案,我发现足以解决我遇到的问题.但即使这样,我也很好奇了解这方面的运作方式.让我用一个例子来说明:

我有一个.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>
Run Code Online (Sandbox Code Playgroud)

现在,为了突破性,我不会发布所有的支持bean代码,但我有这样的东西:

public void find() {
    searchResults = setResults(true);
}
Run Code Online (Sandbox Code Playgroud)

哪里searchResultsArrayList<Objects>.在搜索之后,它不是null - 在多个测试中检查(可以为null,但不在我正在进行的测试中).

现在.这不起作用.

但是,如果我将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>
Run Code Online (Sandbox Code Playgroud)

现在,这种变化可以让一切正常.我对此感到满意......但我想我也在寻求一些理解.有关为什么我必须嵌套这些组件的任何见解?我肯定错过了一些东西!

Bal*_*usC 62

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

如果你在其中另一个组件包裹有条件JSF渲染组件它只会工作,总是呈现为HTML输出,从而总是存在于HTML DOM树,因此始终获得由JavaScript.在ajax渲染/更新期间引用该包装器组件.

也可以看看: