2

問題:EL式を複合コンポーネントに渡していますが、EL式が以前ではなく複合コンポーネントの内部から評価されています。EL式が文字列に評価されることを意図して、複合コンポーネントに送信されます。

複合コンポーネントがありますMenuTable

<cc:interface>
    <cc:attribute name="model" type="nz.co.tradeintel.web.MenuTable"/>
    <cc.attribute name="updateId" /> 
</cc:interface>

<cc:implementation>
    <h:panelGroup id="menuTable">
    <table>
        <ui:repeat id="repeat1" value="#{cc.attrs.model.rows}" var="row">
            <tr>
            <ui:repeat id="repeat2" value="#{row.contents}" var="entry">
                <td>
                    <p:commandLink action="#{cc.attrs.model.setSelected(entry)}" update="#{cc.attrs.updateId}" value="#{entry.toString()}"/>
                </td>
            </ui:repeat>
            </tr>
        </ui:repeat>
    </table>
    </h:panelGroup>
</cc:implementation>

意図は、次のように絶対コンポーネントIDを属性として渡すことですupdateId

<p:PanelGroup id="updatingPanel">
    <!-- Lots of components.-->
</p:PanelGroup>
<custom:MenuTable updateId="#{component.clientId}:updatingPanel" model="#{menuBackBean.menuTable}" />  

問題は、のEL式が複合コンポーネント内のupdateIdスコープから評価され、次のエラーが発生することです。<p:commandLink />

javax.faces.FacesException: Cannot find component with identifier ":j_idt37:j_idt39:updatingPanel:j_idt61:repeat1:0:repeat2:0:j_idt65:updatingPanel" referenced from "j_idt37:j_idt39:updatingPanel:j_idt61:repeat1:0:repeat2:0:j_idt65".

注:JSFは、複合コンポーネントupdatingPanelにIDが含まれているコンポーネントを更新しようとしていると考えています。

EL式が外部スコープから評価されないのはなぜ<custom:MenuTable/>ですか?

関連する答えがいくつかありますが、このような答えはわかりません。

Mojarra2.1.15の使用

4

1 に答える 1

7

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

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

<p:panelGroup binding="#{updatingPanel}">
    ...
</p:panelGroup>
<custom:MenuTable ... updateId=":#{updatingPanel.clientId}" />

それでも機能しない場合は、を使用しないようにしてください<h:form prependId="false">

参照:

于 2013-01-11T11:38:41.720 に答える