2

我有一些有趣的问题要问你。我正在创建一个复合组件。我知道,我可以使用 ui:param 来存储价值并重用它。但是,如果我将一些相对值(#{component.namingContainer.clientId})存储到该变量中并希望将其作为常量重用怎么办?很难解释 - 这里有我的代码:

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

这是在页面的开头 - 我想准确地存储这个 ID,然后这个变量不使用其他任何东西。但后来如果我在具有自己 ID 的元素中重用它,那就不好了。有趣的是,会发生什么 - JSF 不采用相同的值,而是一个相对的值。它再次读取#{component.namingContainer.clientId},而不是固定值。

请问这个怎么解决,能帮我吗?多谢。

更新仍然有一个重要条件:变量rdfaComp 必须立即可用,因为我在 Javascript 函数中重用它(在同一页面上)。像这样:

<h:commandButton onclick="return selectText('#{rdfaComp}:editor', ...

恐怕,有必要使用这样的相对 ID 链:#{component.namingContainer.parent.namingContainer.parent.clientId} etd。但这真的很糟糕。还有其他解决方案吗?

4

2 回答 2

4

确实只是创建了一个别名,<ui:param>并且 EL 表达式仍然在与引用它的位置完全相同的上下文中对每个访问进行延迟和评估(因此不是它被声明的位置!这解释了你的具体问题)。此外,<ui:param>被设计用于<ui:include><ui:composition>并且<ui:decorate>仅用于。

改为使用<c:set>。它能够立即评估 EL 表达式并通过scope属性将其结果存储在请求、视图、会话或应用程序范围内。

<c:set var="rdfaComp" value="#{component.namingContainer.clientId}" scope="request" />

更新:您实际上想要获取复合组件本身的客户端 ID,您可以通过以下方式获取它:

<c:set var="rdfaComp" value="#{cc.clientId}" scope="request" />
于 2013-09-17T19:14:13.493 回答
0

它已解决 - 我必须再次道歉:-)。我没有正确描述这个问题——我真正想做的事情。我只想使用复合组件的完整客户端 ID。最后我找到了解决方案:#{cc.namingContainer.clientId}

无论如何,谢谢,您的回答非常有帮助!

于 2013-09-19T09:16:12.360 回答