猿问

当我想要Ajax更新一个组件时,为什么我需要在另一个组件中嵌套一个呈现=“#{一些}”的组件?

当我想要Ajax更新一个组件时,为什么我需要在另一个组件中嵌套一个呈现=“#{一些}”的组件?

所以我找到了一些接近这个问题的答案,我找到了足够多的答案来解决我的问题。但即使如此,我还是很好奇能不能理解这件事的运作方式。让我举例说明:

我有手帕.xhtml看起来像这样的页面(短页)。

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

哪里searchResultsArrayList<Objects>..搜索之后,它不会在多个测试中被选中(可以是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>

现在,这种变化允许一切正常工作。我不会介意的.。但我想我也在寻求一些理解。对我为什么要嵌套这些组件有任何见解吗?我肯定漏掉了什么!


斯蒂芬大帝
浏览 425回答 1
1回答

qq_遁去的一_1

Ajax更新由客户端的JavaScript语言执行。JavaScript只能访问HTMLDOM树。如果JSF不向HTML输出呈现任何组件,那么HTML DOM树中就没有任何东西可以通过JavaScript在Ajax更新时获得。JavaScript无法通过其ID获取所需的元素。只有在将有条件JSF呈现的组件包装到另一个组件中时,它才能工作。总呈现到HTML输出,因此总出现在HTMLDOM树中,因此总可通过JavaScript获取。在Ajax呈现/更新期间引用该包装组件。另见:内容的jsf 2-ajax呈现中的通信,内容呈现本身是有条件地呈现的。
随时随地看视频慕课网APP
我要回答