1

複合コンポーネントを作成しました。その中には<f:ajax>タグがあり、その「render」属性はccのパラメーターです。

このようなもの:

    ...
    <cc:attribute name="additionalAjaxRenderIds" type="java.lang.String"></cc:attribute>
    ...
    <h:commandLink value="test" action="#{myBean.someAction}" id="testLink" >
        <f:ajax execute="@this" render="#{cc.attrs.additionalAjaxRenderIds} "/>
    </h:commandLink>
    ...

私はこのccをフォーム内で使用します。これは、すでに外部の名前付けコンテナーにあります。

    <h:form id="myForm">
        ...
        <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myPanel" />
        <h:panelGroup id="myPanel">
            ...
        </h:panelGroup>
        ...
    </h:form>

問題は、私が書く場合

additionalAjaxRenderIds=":#{component.namingContainer.clientId}:myPanel"

このエラーが発生します:

<f:ajax> contains an unknown id ':j_idt44:myForm:myCC:myPanel' - cannot locate it in the context of the component testLink

一方、これを使用する場合(+ .parent):

additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myPanel"

エラーは次のとおりです。

<f:ajax> contains an unknown id ':j_idt44:myPanel' - cannot locate it in the context of the component testLink

期待されるIDの代わりに:

':j_idt44:myForm:myPanel'

ですから、私のccのネーミングコンテナの親はフォームではなく、外部のネーミングコンテナのようです。

次の方法はありますか:1、正しい親(フォーム)を取得する2、パラメーターとして渡す前にELを評価する(したがって、EL式の代わりに計算されたclientIdをccに渡すことができるため、コンポーネントは参照しませんcommandLinkタグに、しかし私がccを入れたh:formに)

私は私が使うことができることを知っています

additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myForm:myPanel" 

しかし、私はその解決策が好きではありません

また、フォームのprependId属性をfalseに設定すると、コンポーネントのルックアップ全体が壊れます(結果としてajaxタグも壊れます)

4

1 に答える 1

0

EL式は、コンポーネントが構築された時点では評価されませんが、属性がアクセスされた時点では評価されません。つまり、これらはランタイムであり、ビルドタイムではありませ。は、EL式が評価された時点での現在の#{component}UIコンポーネントを指します。これは、特定の場合はです。それは異なる結果を説明しています。<h:commandLink>

を使用せずに、これに別の方法でアプローチする必要があります#{component}

例えば

<h:form id="myForm" binding="#{myForm}">
    ...
    <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{myForm.clientId}:myPanel" />
    <h:panelGroup id="myPanel">
        ...
    </h:panelGroup>
    ...
</h:form>

また

<h:form id="myForm">
    ...
    <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{myPanel.clientId}" />
    <h:panelGroup id="myPanel" binding="#{myPanel}">
        ...
    </h:panelGroup>
    ...
</h:form>
于 2012-12-30T19:01:54.760 に答える