2012-07-23 41 views
2

是否有辦法在表格行選擇的基礎上動態啓用/禁用commandButton?在Primefaces表格行選擇的基礎上動態啓用/禁用commandButton

在接下來的例子,我想啓用「deleteBtn」只有在有選擇的任何行:

<p:dataTable 
    var="department" value="#{departmentCtrl.departmentTable}" 
    selection="#{departmentCtrl.departmentList}"> 

    <p:column selectionMode="multiple" styleClass="w18" /> 

    <p:column headerText="#{msgs.id}" sortBy="#{department.id}"> 
     <h:outputText value="#{department.id}" /> 
    </p:column> 

    <p:column headerText="#{msgs.name}" sortBy="#{department.name}"> 
     <h:outputText value="#{department.name}" /> 
    </p:column> 
</p:dataTable> 

<p:commandButton id="deleteBtn" value="#{msgs.delete}" disabled="???" /> 

感謝

+1

如何使用''<:p:ajax event =「rowSelect」'或其他事件看看這個例子http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf – Daniel 2012-07-23 10:30:50

+0

它不起作用。 我想要做的與基於複選框的選擇示例(http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionRadioCheckbox.jsf)相同;但使用文檔(Primefaces用戶指南v3.3) – webmeiker 2012-07-24 08:48:43

+0

中的rowSelectCheckbox和rowUnselectcheckbox事件,那麼爲什麼不使用類似這樣的東西? Daniel 2012-07-24 09:02:09

回答

3
  1. 你應該每次更新您的按鈕選擇或取消選擇事件 發生。
  2. departmentList爲空時,應該將其禁用。

    <p:dataTable var="department" 
    
    value="#{departmentCtrl.departmentTable}" 
    
    selection="#{departmentCtrl.departmentList}"> 
    
         <p:ajax event="rowSelect" update="deleteBtn"/> 
         <p:ajax event="rowUnselect" update="deleteBtn"/> 
    
         <p:column selectionMode="multiple" styleClass="w18" /> 
    
         <p:column headerText="#{msgs.id}" sortBy="#{department.id}"> 
          <h:outputText value="#{department.id}" /> 
         </p:column> 
    
         <p:column headerText="#{msgs.name}" sortBy="#{department.name}"> 
          <h:outputText value="#{department.name}" /> 
         </p:column> 
    
    </p:dataTable> 
    
        <p:commandButton id="deleteBtn" value="#{msgs.delete}" 
         disabled="#{fn:length(departmentCtrl.departmentList) == 0}" /> 
    

BTW不要忘記添加FN命名空間到你的Facelets文件。

+0

謝謝,但很抱歉,它不起作用。 我想要做的與基於複選框的選擇示例(http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionRadioCheckbox.jsf)相同;但是使用文檔中所述的rowSelectCheckbox和rowUnselectcheckbox事件(Primefaces用戶指南v3.3的第141頁) – webmeiker 2012-07-24 08:48:31

+0

fn命名空間:xmlns:fn =「http://java.sun.com/jsp/jstl/functions」 – 2012-12-05 11:58:36

-2

[解決]

在管理豆我從改變:

名單departmentList;

系[] departmentList;

那麼我可以用:

<p:ajax event="rowSelectCheckbox" listener="#{departmentCtrl.departmentSelected}" 
         update=":formManageDepartment:departmentBtnPanel,:formManageDepartment:deleteDepartmentBtn"/> 
        <p:ajax event="rowUnselectCheckbox" listener="#{departmentCtrl.departmentUnselected}" 
         update=":formManageDepartment:departmentBtnPanel,:formManageDepartment:deleteDepartmentBtn"/> 
+1

你沒有發佈你的支持bean代碼。你的解決方案沒有關於按鈕的禁用屬性。你只改變了事件名稱。 – 2012-07-24 13:40:27

0

有點遲到了可能,但這裏是什麼了,我根據在複選框中選擇表每一個可能的類型點擊的啓用和禁用。在我的情況下,我只需要告訴Print和Delete按鈕在沒有任何選擇時禁用。

<p:ajax event="rowSelect" update=":form:printBtn,:form:deleteBtn" /> 
<p:ajax event="rowUnselect" update=":form:printBtn,:form:deleteBtn" /> 
<p:ajax event="toggleSelect" update=":form:printBtn,:form:deleteBtn" /> 
<p:ajax event="rowSelectCheckbox" update=":form:printBtn,:form:deleteBtn" /> 
<p:ajax event="rowUnselectCheckbox" update=":form:printBtn,:form:deleteBtn" /> 

這可能是你實際上並不需要所有五個事件,但我做到了。 rowSelectrowUnselect處理不在複選框中的鼠標點擊。 toggleSelect處理選中全部/無(列標題中的一個)和rowSelectCheckboxrowUnselectCheckbox處理行中複選框的複選框。

0

我爲時已晚,無法回覆。但它可能有助於某人。當用戶沒有選擇任何複選框時,我有相同的要求來禁用按鈕。

我正在使用Primefaces 5.1

這是我提出的解決方案。

我使用widgetVar來檢查選定的行數並啓用/禁用命令按鈕。

從Primefaces記錄我們有一個數據表客戶端API:

enter image description here

而且我們有命令按鈕客戶端API

enter image description here

現在我們會回來到實施部分

<p:dataTable var="line" varStatus="loop" 
        value="#{myexpense.lazyModel}" paginator="true" 
        rows="#{myexpense.rows}" 
        rendered="#{myexpense.userIdSearch eq null}" 
        rowIndexVar="row" 
        emptyMessage="#{tk.expense_table_empty}" 
        paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} 
        {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
        widgetVar="expenseEntryTable" 
        rowsPerPageTemplate="#{myexpense.rowsPerPageTemplate}" 
        id="lazyDataTable" lazy="true" 
        selection="#{myexpense.selectedExpenseEntryList}" 
        rowKey="#{line.oid}"> 
        <p:ajax event="toggleSelect" oncomplete="disableOrEnableCommandButton();" update="updateBtn"/> 
        <p:ajax event="rowSelectCheckbox" oncomplete="disableOrEnableCommandButton();" update="updateBtn"/> 
        <p:ajax event="rowUnselectCheckbox" oncomplete="disableOrEnableCommandButton();" update="updateBtn"/> 
        <p:column selectionMode="multiple" width="3%" styleClass="centerAlignColumn selectAll" id="selectAll"/> 
        .... more column 
        <f:facet name="footer"> 
         <p:commandButton process="lazyDataTable" value="#{tk.expense_update_selected}" partialSubmit="true" ajax="true" widgetVar="updateBtn" disabled="#{myexpense.disableUpdateButton}" 
          actionListener="#{myexpense.updateSelected}" 
          update="lazyDataTable @form" rendered="#{myexpense.form.myOnly}" /> 
        </f:facet> 
       </p:dataTable> 

正如你所看到的,我已經定義了2個widgetVar,一個用於數據表(expenseEntryTable),另一個用於命令按鈕(updateBtn)。

另外我定義了disbaled屬性#{myexpense.disableUpdateButton},這對頁面加載時會有幫助。

private Boolean disableUpdateButton; 
    public Boolean getDisableUpdateButton(){ 
      disableUpdateButton = !((selectedExpenseEntryList!=null) && (!selectedExpenseEntryList.isEmpty())); 
      return disableUpdateButton; 
     } 

現在你可以編寫java腳本。

function disableOrEnableCommandButton() { 
    if (PrimeFaces.widgets['expenseEntryTable']) { 
     if (PF('expenseEntryTable').getSelectedRowsCount() > 0) { 
      PF('updateBtn').enable(); 
     } else { 
      PF('updateBtn').disable(); 
     } 
    } 
} 

希望它可以幫助任何人!

相關問題