2010-12-29 2 views
5

Я использую DataTable PrimeFaces для отображения записей (случайно генерируемых в приложении песочницы). Я использую вариант выбора флажка. Основной DataTable отлично работает, включая кнопки «Удалить» и «Отмена» (какая функциональность доступна только в диалоговом окне подтверждения). Я пытаюсь добавить функциональность к DataTable, чтобы при выборе флажка другие элементы управления на странице были включены или отключены на основе выбора.PrimeFaces DataTable - нужно включить/отключить компоненты на основе выбора строки

Другими словами, если никакие строки не выбраны (флажки не отмечены) определенные кнопки и/или пункты меню отключены или не отображаются. Выбор одной или нескольких строк с помощью флажка должен включать или отображать элементы управления. Я попытался использовать встроенные обработчики событий JavaScript, но я не могу сделать эту работу.

В настоящее время на моей странице отображаются столбцы DataTable 5: столбец выбора флажка, имя, фамилия, возраст. Я сделал что-то вроде этой работы в другой песочнице, используя простые булевы флажки и обновляя логическое значение с событием onclick. К сожалению, похоже, что в этом DataTable ничего подобного не было, или если я не знаю, как его реализовать.

Мой индекс страницы:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.prime.com.tr/ui" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 

    <body> 

     <ui:composition template="./newTemplate.xhtml"> 


      <ui:define name="content"> 
      <h:form> 

       <p:dataTable rowSelectListener="#{tableBean.onRowSelect}" var="data" value="#{tableBean.data}" paginator="true" rows="10" 
        selection="#{tableBean.selectedNames}"> 

       <f:facet name="header"> 
        Customer List 
       </f:facet> 


       <p:column selectionMode="multiple" /> 

       <p:column headerText="Cust ID"> 
        <h:outputText value="#{data.id}" /> 
       </p:column> 

       <p:column headerText="First Name"> 
        <h:outputText value="#{data.firstName}" /> 
       </p:column> 

       <p:column headerText="Last Name"> 
        <h:outputText value="#{data.lastName}" /> 
       </p:column> 

       <p:column headerText="Age"> 
        <h:outputText value="#{data.age}" /> 
       </p:column> 

       <f:facet name="footer">       
        <p:commandButton update="deleteList" value="Delete" oncomplete="deleteDlg.show()" /> 
       </f:facet> 

      </p:dataTable> 

      <p:dialog header="Delete Selected Records" modal="true" widgetVar="deleteDlg" 
         > 

       <h:outputText value="You are about to permanently delete records." /><br /><br /> 
       <h:outputText value="Are you sure you want to continue?" /><br /><br/> 

       <h:commandButton value="CANCEL" action="#{tableBean.cancelDelete()}" /> <h:commandButton value="Delete" action="#{tableBean.deleteNames()}" /> 
      </p:dialog> 

     </h:form> 
      </ui:define> 

     </ui:composition> 

    </body> 
</html> 

код из моего бэк-бобов, которые могут иметь отношение:

public void deleteNames() 
    { 
     for(Data person : selectedNames) 
     { 
      data.remove(person); 
     } 
    } 

    public void cancelDelete() 
    { 
     for(Data name : selectedNames) 
      selectedNames = null; 
    } 

    public void onRowSelect(SelectEvent event) 
    { 
     if(selectedNames == null || selectedNames.length < 1) 
      setDisable(true); 
     else 
      setDisable(false); 
    } 

public boolean isDisable() { 
     if(selectedNames == null || selectedNames.length < 1) 
      disable = true; 
     else 
      disable = false; 
     return disable; 
    } 

    public void setDisable(boolean disable) { 
     this.disable = disable; 
    } 
+0

Ну, единственная работа, с которой я смог придумать, - это отказаться от флажков. PrimeFaces имеет опцию «мгновенного выбора», в которой вы выбираете нужный файл в любом месте в строке данных. Используя эту опцию, с помощью selectionMode = "multiple" и меняя мои кнопки команд из стандартных JSF в командлеты PrimeFaces, я могу включать и выключать их, когда строки выбраны или не выбраны. Я бы предпочел использовать флажки для выбора, но это не представляется возможным с использованием данных PrimeFaces. – Sean

ответ

1

Существует обходной путь на самом деле, по крайней мере, для меня работа.

  • извлечь datatable.js из primefacess
  • изменить datatable.js selectRowWithRadio, функции selectRowWithRadio ниже
     
        PrimeFaces.widget.DataTable.prototype.selectRowWithCheckbox = function(element) { 
         ... 
         ... 
         //save state 
         this.writeSelections(); 
    
         // added to add instant row selection 
         this.fireRowSelectEvent(rowId); 
         // end 
        } 
    
  • Append на JavaScript ниже конца вашего DataTable компонента
     
    <p:datatable widgetVar="wv1" id='mydatatable' ....> 
    ... 
    <p:datatable/> 
    <script type="text/javascript"> 
        if(!wv1_main.cfg.onRowSelectUpdate){ 
         wv1.cfg.onRowSelectUpdate=""; 
        }else{ 
         wv1.cfg.onRowSelectUpdate+=" "; 
        } 
        wv1.cfg.onRowSelectUpdate+="UPDATE_IDS"; 
    </script> 
    
    Заменить «UPDATE_IDS» с идентификаторами панели, разделенными пробелом, например «panel1 panel2»;
    Заменить «wv1» со значением таблицы данных widgetVar имущества
  • импортировать измененные JS в странице JSF, где вы хотите использовать мгновенный АЯКС выбор флажка/Радий.
     
    <h:header/> 
    ... 
    <script type="text/javascript" src="#{CONTEXT_PATH}/resources/js/datatable.js"/> 
    <h:header/> 
    

вы можете Важнейшее выбранные строки с некоторыми более модификации

+0

Спасибо за работу. – Sean

1

Был просто поиск для решения одной и той же проблемы и с тех пор JSF 2/Primefaces, меняются довольно быстро в эти дни, нашли еще до -точное решение для . Поверхности версии 3.0 или выше.

По следующий ответ в PrimeFaces теме форума: http://forum.primefaces.org/viewtopic.php?f=3&t=1373&sid=bbfcd6a343edf586f927cd7ecd7d01b9&start=10#p48388

можно добавить на стороне клиента, Javascript обработчик для <p:datatable> компонента, выполнив следующие действия:

1.Добавьте primefaces-extension JAR в путь к вашему вебпупу (эта библиотека также доступна в центральном репозитории Maven под тем же именем). Я попробовал версию 0.6.3, которая была последней на момент написания, и он работал на меня

2.Add pe имен в соответствующие xhtml файла:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.prime.com.tr/ui" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:pe="http://primefaces.org/ui/extensions"> 

     ... 

</html> 

3.Add <pe:javascript> как дочерний элемент к вашему <p:datatable> компонент (может быть добавлен фактически к любому компоненту, который реализует интерфейс ClientBehaviorHolder), как в следующем:

<html> 
    ... 
    <p:dataTable rowSelectListener="#{tableBean.onRowSelect}" var="data" value="#{tableBean.data}" paginator="true" rows="10" selection="#{tableBean.selectedNames}"> 
     <pe:javascript event="rowSelect" execute="onRowSelectedHandler();"/> 
     ... 
    </p:dataTable> 
    ... 
</html> 

и что Shoul d be it, надеюсь, это поможет ...

0

Вы можете поймать ajax событий, которые были запущены при выборе строки.

В вашем случае,

<p:dataTable rowSelectListener="#{tableBean.onRowSelect}" 
    var="data" value="#{tableBean.data}" paginator="true" rows="10" 
    selection="#{tableBean.selectedNames}"> 

    <p:ajax event="rowSelectCheckbox" listener="#{tableBean.handleEvent}" 
     update="buttonThatNeedsToBeRendered"/> 

    <p:column selectionMode="multiple" /> 

    ... 

</p:dataTable> 

Другие полезные события, срабатывающие в зависимости от режима выбора из dataTable являются:

  1. rowSelect и rowUnselect
  2. rowSelectCheckbox и rowUnselectCheckbox
  3. rowSelectRadio
  4. toggleSelect
+0

Спасибо за полезные «события» –

Смежные вопросы