使用 EL 表达式将组件 ID 传递给 JSF 中的复合组件

2024-01-12

问题:我将 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 认为我正在尝试更新 ID 为updatingPanel这是inside复合组件。

为什么不从外部范围计算 EL 表达式:<custom:MenuTable/>?

有几个相关的答案,但我不明白它们,例如this one https://stackoverflow.com/questions/9205938/passing-el-expression-to-composite-component.

使用 Mojarra 2.1.15


EL 表达式不是在构建组件时计算的,而是在访问属性时计算的。换句话说,他们是runtime并不是构建时间. The #{component}指的是current用户界面组件 http://docs.oracle.com/javaee/6/api/javax/faces/component/UIComponent.html#getCurrentComponent%28javax.faces.context.FacesContext%29在计算 EL 表达式时,在您的特定情况下<p:commandLink>。这就解释了不同的结果。

您需要以不同的方式处理这个问题,而不使用#{component}。其中一种方法是

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

如果仍然不起作用,请确保您不使用<h:form prependId="false">.

也可以看看:

  • 如何找到ajax更新/渲染组件的客户端ID?找不到带有从“bar”引用的表达式“foo”的组件 https://stackoverflow.com/questions/8634156/how-to-reference-components-in-jsf-ajax-cannot-find-component-with-identifier/8644762#8644762
  • UIForm 与 prependId="false" 中断 https://stackoverflow.com/questions/7415230/jsf-namingcontainer-and-uiform-with-prependid
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 EL 表达式将组件 ID 传递给 JSF 中的复合组件 的相关文章

随机推荐