UI: повторите, используя тот же идентификатор клиента. c: foreach работает отлично - PullRequest
1 голос
/ 06 апреля 2011

Я знаю, что это может иметь какое-то отношение к фазе, в которую входит каждый.

Если я сделаю это.

 <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 показывает, что один и тот же идентификатор генерируется для каждой итерации.Я попытался поместить loop.index для создания идентификатора, и это выдает ошибку, в которой говорится, что идентификатор не может быть пустым.

Если я заменяю пользовательский интерфейс: repeat на ac: forEach, он работает нормально.Отладка javascript показывает, что для каждой итерации создается новый идентификатор.

Вот мой вспомогательный код (некоторые из них).

    <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");

Идентификатор должен быть другим, чтобы JavaScript могсделать правильное делениеЯ попытался явно определить атрибут id, а затем передать его в качестве идентификатора в коде клиента.Как я уже говорил, это не работает.Спасибо за любую помощь.

** РЕДАКТИРОВАТЬ **

Вот моя проблема.Я не могу использовать clientId в теге div из-за символа двоеточия, очевидно.Я изменил его в javascript, но как бы получить это значение в div.Я не могу получить тег div по идентификатору, потому что мне нужно создать идентификатор.Кажется, я не могу сделать 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');

1 Ответ

1 голос
/ 06 апреля 2011

Я провел быстрый тест в локальной среде (Mojarra 2.0.4 на Tomcat 7.0.11).Использование #{cc.clientId} каждый раз возвращает вам уникальный идентификатор.

<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)

...