richfaces датируемые и подтаблицы - PullRequest
1 голос
/ 01 ноября 2010

У меня есть следующие данные:

<rich:dataTable id="grid1" value="#{monitorForm.customerList}" var="custRow">
 <rich:column width="5">
  <h:selectBooleanCheckbox value="#{custRow.selected}">
   <a:support event="onclick" action="#{monitorForm.selectOrderLines(custRow)}" 
      reRender="custTable_#{custRow.id}"/>
  </h:selectBooleanCheckbox>
 </rich:column>

 <rich:subTable id="custTable_#{custRow.id}"
      var="row" value="#{custRow.orderList}" rendered="#{custRow.show}">
<rich:column width="5">
 <h:selectBooleanCheckbox value="#{row.checked}" />
</rich:column>

    <rich:column>
 <h:outputText value="#{row.name}" />
</rich:column>
 </rich:subTable>

</rich:dataTable>

Когда я нажимаю на флажок, действие #{monitorForm.selectOrderLines(custRow)} устанавливает флажки для выбранного клиента, и я хочу, чтобы только субтаблица для этого клиента отображалась повторно.Вышеуказанное не работает.

Ошибка [AjaxContext] Target component for id custTable_<id number> не существует.

Все работает нормально, когда я использую reRender="grid1", но это может быть очень медленным, когда много строк.

Возможно ли иметь rich:subTable с динамическим идентификатором, который я могу использовать для повторного рендеринга только этой подтаблицы?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2010

Не могли бы вы попытаться установить подтаблицу id="custTable" и сделать reRender="custTable" и посмотреть, подходит ли вам это.

0 голосов
/ 02 ноября 2010

Обходной путь, который я использую сейчас:

<rich:dataTable id="grid1" value="#{monitorForm.customerList}">
  <rich:column width="5">
    <h:selectBooleanCheckbox value="" onclick="selectAllPackingLists(this, '#{custRow.id}')"/>
  </rich:column>  

<rich:subTable var="row" value="#{custRow.orderList}" rendered="#{custRow.show}">
    <rich:column>
      <input type='hidden' value='#{custRow.id}'/>
    </rich:column>

<rich:column width="5">
 <h:selectBooleanCheckbox value="#{row.checked}" />
</rich:column>

</rich:subTable>

</rich:dataTable>

функция JavaScript:

                function selectAllPackingLists(o, id) {
                    var elem = jQuery("table[id='monitorFrm:grid1'] > tbody");
                    var checked = o.checked;

                    var rows = elem.attr('rows');

                    jQuery.each(rows, function(index, row) {
                            // for each row check if the input value in 1st column
                            // matches the selected customer id
                        var td = jQuery('td:first', this);
                        var hiddenFld = jQuery('input:first', td);

                        if (hiddenFld.val() == id) {
                                  // set the checkbox in the 2nd column to true 
                            var td2 = jQuery('td:nth-child(2)', this);
                            var cb = jQuery('input:first', td2);

                            jQuery(cb).attr('checked', checked);
                        }
                    });
                }

Что замечательно, так это то, что установка флажков через JQuery также устанавливает значения в бине для каждого соответствующего <h:selectBooleanCheckbox value="#{row.checked}" />

Я не знал, что это сделает.

...