【问题标题】:Duplicated ID on JSF custom tag when nesting tags嵌套标签时 JSF 自定义标签上的重复 ID
【发布时间】:2013-10-14 05:06:48
【问题描述】:

由于性能问题,我正在将一些复合材料迁移到自定义标签。使用复合材料时,所有 Id 均已正确生成,但在使用自定义标签时,我遇到了重复的 Id 异常,即使我创建了自定义 EL 表达式来生成新 ID。

经过一番研究,似乎是因为嵌套标签时继承了标签属性:

<far:fcontainer name="**father1**" type="panel">
 <far:fcontainer type="panel">
  <far:fcontainer type="panel">child 3</farTag:fcontainer>
 </far:fcontainer>
</far:fcontainer>

在示例中,第一个 fcontainer 应该有 id father1,嵌套的应该有生成的 ID,但这就是我所拥有的:

<div id="**father1**" class="ui-widget-content">
 <div id="**father1**" class="ui-widget-content">
  <div id="**father1**" class="ui-widget-content">child3</div>
 </div>
</div>

自定义标签是:

<ui:composition>
    <p:outputPanel layout="block" styleClass="#{type == 'panel'?'ui-widget-content':''}" 
         id="#{empty name ? far:generateId() : name}">
        <ui:insert />
    </p:outputPanel>
<ui:composition>

这正常吗?有什么解决办法吗?

在 Mojarra 2.1.26 上测试。

提前致谢。

更新:在 MyFaces 2.1.12 上测试,似乎工作正常,Mojarra 的错误?

【问题讨论】:

  • 在 MyFaces 中,对 id 生成算法进行了重大修复,使其更具可预测性和独特性,从而更加稳定。这是一个漫长的故事,有很多艰苦的工作,但在我看来,这是迄今为止解决这个问题的最佳方法。似乎 Mojarra 仍然有旧的 facelets 1.1.x 算法,我想你在 Mojarra 中看到的合成器是由比在 MyFaces 2.2.x 中发现的算法的一些重要缺陷引起的,记住 facelets 代码也捐赠给了 MyFaces ,所以这两个实现最初都使用了相同的代码。
  • 您可以在生成的标签之前连接一些单词吗?你试过吗?

标签: jsf jsf-2 mojarra custom-tag


【解决方案1】:

解决这个问题的方法是始终使用自定义 EL 表达式,在其中您可以首先检查父组件是否设置了属性。

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2014-12-26
    • 2018-01-03
    • 2016-08-25
    • 2011-12-15
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多