gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:55:38 24 4
gpt4 key购买 nike

问题:我将一个 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}" />

问题是,updateId 的 EL 表达式从 <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 的组件它位于复合组件的内部

为什么不从外部作用域计算 EL 表达式:<custom:MenuTable/>

有几个相关的回答,但是没看懂,比如this one .

使用 Mojarra 2.1.15

最佳答案

EL 表达式不会在构建组件时计算,但会在访问属性时计算。换句话说,它们是运行时 而不是构建时#{component}指的是current UI component目前评估 EL 表达式,在您的特定情况下是 <p:commandLink> .这就解释了不同的结果。

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

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

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

另见:

关于ajax - 使用 EL 表达式将组件 ID 传递给 JSF 中的复合组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com