1

複合コンポーネントを作成しましたが、予約済みのEL#{component.clientId}を使用してJQueryバインドを作成したいと思います。この取得したclientIdをページ内の別の場所(コンポーネント外)で使用するには、JSTLを使用してビュースコープ変数に格納します。奇妙なことに、JSTLは、子の前にIDを追加するという自然な複合コンポーネントの動作(NamingContainer動作)を妨げているようです。ui:repeatJSTLは少しトリッキーで、ライフサイクルの問題のために他のコンポーネント(たとえば)に干渉することは知っていますが、ここではこの動作を理解していません。

いくつかの具体的なコードは、この長いスピーチよりも優れています。

<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:rich="http://richfaces.org/rich"
        xmlns:c="http://java.sun.com/jsp/jstl/core"    
        xmlns:composite="http://java.sun.com/jsf/composite">
    <composite:interface>
        […]
    </composite:interface>
    <composite:implementation>
        <rich:dataTable id="mySoLovedDataTable" […]>
            #{component.clientId}
            <!-- Commenting or uncommenting this line make the whole point -->
            <c:set var="targetClientId" value="#{component.clientId}" scope="view" />
            […]
        </rich:dataTable>
    </composite:implementation>
</html>

コメントされた行で、の#{component.clientId}ようなものを与えますj_idt261:mySoLovedDataTable

コメントアウトされた行で、それはちょうどを与えますmySoLovedDataTable

4

1 に答える 1

3

JSTLは、ビューのビルド時に実行されます。これは、JSFがビューテンプレートを解析して、十分に価値があり、レンダリング可能なJSFコンポーネントツリーになる時点で実行されます。JSFは、ビューのレンダリング時に実行されます。これは、JSFがコンポーネントツリーを一連のHTMLにエンコードする時点で実行されます。次のように視覚化できます。JSTLは最初に上から下に実行され、JSFタグのみで結果を生成します。次に、JSFレンダリング応答フェーズ中に、JSFは上から下に実行され、HTML結果を生成します。

言い換えると、JSTLとJSFは、コーディングから期待されるように同期して実行されません。<ui:param>通常、JSTLの代わりにFaceletsを使用します<c:set>

<ui:param name="targetClientId" value="#{component.clientId}" />

これは実際にはどのスコープにも何も設定しないことに注意してください。与えられた式の一種の「エイリアス」を作成するだけです。特定のケースで意図したとおりに機能するかどうかはわかりませんが、機能要件を理解している限り、コンポーネントの<rich:dataTable>で、ビューでさらにクライアントIDを取得できるようにしたいと考えています。その場合は、以下を使用することをお勧めします。binding

<rich:dataTable binding="#{table}" ...>
    ...
</rich:dataTable>

<script>
    var $table = jQuery("[id='#{table.clientId}']");
    // ...
</script>
于 2011-08-23T12:07:47.617 に答える