35

だから私はこれに近いいくつかの答えを見つけました、そして私は私が持っていた問題を解決するのに十分なものを見つけました。しかし、それでも、この周りの仕組みを理解することに興味があります。例を挙げて説明しましょう:

このような(短縮された)フェイスレット.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);
}

はどこsearchResultsにありますかArrayList<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>

現在、この変更により、すべてが正常に機能するようになりました。これで大丈夫だと思いますが…でも少し理解を求めていると思います。これらのコンポーネントをネストする必要がある理由についての洞察はありますか?きっと何かが足りない!

4

1 に答える 1

67

Ajaxの更新は、クライアント側でJavaScript言語によって実行されます。JavaScriptがアクセスできるのはHTMLDOMツリーだけです。JSFがHTML出力にコンポーネントをレンダリングしない場合、Ajaxの更新時にJavaScriptによって取得できるHTMLDOMツリーには何もありません。JavaScriptはIDで目的の要素を取得できません。

これは、条件付きでJSFでレンダリングされたコンポーネントを、常にHTML出力にレンダリングされるため、常にHTML DOMツリーに存在し、 JavaScriptで常に取得できる別のコンポーネントでラップする場合にのみ機能します。代わりに、ajaxのレンダリング/更新中にそのラッパーコンポーネントを参照してください。

参照:

于 2012-01-25T21:45:35.537 に答える