开发者

richfaces datatable and subtable

开发者 https://www.devze.com 2023-01-22 16:43 出处:网络
I have the following datable: <rich:dataTable id=\"grid1\" value=\"#{monitorForm.custo开发者_运维百科merList}\" var=\"custRow\">

I have the following datable:

<rich:dataTable id="grid1" value="#{monitorForm.custo开发者_运维百科merList}" 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>

When I click on the checkbox the action #{monitorForm.selectOrderLines(custRow)} sets the checkboxes for the selected customer and I want only the subtable for that customer to be reRendered. The above does not work.

The error is [AjaxContext] Target component for id custTable_<id number> does not exist.

Everything works fine when I use reRender="grid1" but that can be very slow when there are many rows.

Is it possible to have rich:subTable with a dynamic id that I can use for reRendering only that subTable?


A workaround I am using now is:

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

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

What is great is that setting the checkboxes via JQuery also sets the values in the bean for each corresponding <h:selectBooleanCheckbox value="#{row.checked}" />

I did not know that it would do that.


Could you try setting the subTable id="custTable" and do reRender="custTable" and see if that works for you.

0

精彩评论

暂无评论...
验证码 换一张
取 消