【问题标题】:ui:repeat using the same client id. c:foreach works fineui:repeat 使用相同的客户端 ID。 c:foreach 工作正常
【发布时间】:2011-07-30 07:37:58
【问题描述】:

我知道这可能与每个人所处的阶段有关。

如果我这样做。

 <ui:repeat id="repeatChart" varStatus="loop" value="#{viewLines.jflotChartList}" var="jflotChart">
                <p:panel>
                    <jflot:chart height="300" width="925" dataModel="#{jflotChart.dataSet}" dataModel2="#{jflotChart.dataSet2}" 
                                 xmin="#{jflotChart.startDateString}" 
                                 xmax="#{jflotChart.endDateString}"
                                 shadeAreaStart ="#{jflotChart.shadeAreaStart}"
                                 shadeAreaEnd ="#{jflotChart.shadeAreaEnd}"
                                 lineMark="#{jflotChart.wrapSpec.benchmark}" yMin="#{jflotChart.yMin}" yMax="#{jflotChart.yMax}"  />
                </p:panel>
                <br />
            </ui:repeat>     

我的代码不起作用。调试 javascript 表明每次迭代都会生成相同的 id。我试过把 loop.index 来创建一个 id,这给了我一个错误,说 id 不能为空。

如果我将 ui:repeat 换成 c:forEach 就可以了。调试 javascript 显示每次迭代都会创建一个新 id。

这是我的支持代码(其中一些)。

    <div id="#{cc.id}_flot_placeholder" style="width:#{cc.attrs.width}px;height:#{cc.attrs.height}px;">

        <script type="text/javascript">                 
       //<![CDATA[           
       $(function () {    

var placeholder = $("##{cc.id}_flot_placeholder");
var overviewPlaceholder = $("##{cc.id}_flot_overview");

id 需要不同,以便 javascript 可以呈现到正确的 div。我尝试明确定义一个 id 属性,然后将其作为 id 传递给客户端代码。就像我之前说的那样,这不起作用。感谢您的帮助。

**编辑**

这是我的问题。由于冒号字符,我不能在 div 标签中使用 clientId。我已经在 javascript 中对其进行了修改,但我将如何将该值传递给 div。我无法通过 id 获取 div 标签,因为我需要生成 id。我似乎也不能做一个 document.write() 。我被困在这一点上。

  <composite:implementation>                

       <div id="#{cc.clientId}_flot_placeholder" style="width:400px;height:400px;">


        <script type="text/javascript">                 
       //<![CDATA[           
       $(function () {  

var clientIdOld = '#{cc.clientId}';  
var clientId = clientIdOld.replace(':', '_');
var placeholder = $('#'+clientId+'_flot_placeholder');
var overviewPlaceholder = $('#'+clientId+'_flot_overview');

【问题讨论】:

  • 你的问题有点混乱。 whatid 相同?您仅在 &lt;ui:repeat&gt; 上拥有它,但在 &lt;ui:repeat&gt; 上根本不支持此属性。支持代码似乎是一个复合组件。是&lt;jflot:chart&gt;吗?
  • 在复合组件中,它将 id 作为不同的占位符变量。这个占位符(div)也是flot(图表库)用来显示图表的。如果我使用 c:forEach 生成的 id 就像每个循环的 jdt:78、jdt:79 等。如果我使用 ui:repeat ,则 id 是相同的。 jdt:78,jdt:78,jdt:78。所以有一个 div 具有相同的 id 5 或 6 次。
  • 对了。恐怕这是&lt;ui:repeat&gt; 上的众多问题之一。 java.net/jira/secure/QuickSearch.jspa?searchString=ui:repeat 哪个 JSF 实现/版本?
  • 啊。我不能休息。我正在使用 Mojarra。我现在在家,所以我现在不确定版本。我今天把笔记本电脑忘在工作上了。我该怎么办?我不能真正使用 c:forEach 因为这会降低我的页面性能,因为它会为每个请求调用构造函数。

标签: jsf-2 jstl java-ee-6


【解决方案1】:

我对本地环境进行了快速测试(Tomcat 7.0.11 上的 Mojarra 2.0.4)。使用#{cc.clientId} 每次都会给你一个唯一的ID。

<ui:repeat value="#{bean.items}" var="item">
    <cc:test />
</ui:repeat>

<cc:implementation>
    <div id="#{cc.clientId}_foo">foo</div>
</cc:implementation>

这是生成的 HTML 源代码:

<div id="j_idt6:0:j_idt7_foo">foo</div>
<div id="j_idt6:1:j_idt7_foo">foo</div>
<div id="j_idt6:2:j_idt7_foo">foo</div>

这应该足以满足您的功能要求。您可能只想转义默认分隔符 : 或将其替换为自定义分隔符,因为它是 CSS 选择器中的保留字符。


更新:所以你想逃避它,你应该把:替换为\:而不是_

var clientId = clientIdOld.replace(/:/g, '\\:');

/:/g 是一个正则表达式,它确保所有匹配项都将被替换,双斜杠只是为了在 JS 字符串中转义斜杠本身,就像您通常在 Java 字符串中所做的那样)

【讨论】:

  • 嘿,谢谢。这确实创建了一个特定的 ID。我在让它与我的代码一起工作时遇到了很大的麻烦。我无法将修改后的值放入 div 标签 ID。我已经更新了我之前的帖子。
  • 再次感谢。我想出了下划线的问题。替换只替换第一次出现的字符。 var clientId = clientIdOld.replace(/:/g, '\\:');来源kodyaz.com/articles/…这是全部替换所需的代码。
  • 哦,是的,JS String#replace() 的行为确实与 Java 的 String#replace() 不同。对不起,我应该知道的。很好,你想通了。
猜你喜欢
  • 2017-08-17
  • 2021-07-30
  • 2017-09-23
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2015-09-19
相关资源
最近更新 更多