2013-08-20 42 views
8

Tôi muốn cho phép người dùng chỉnh sửa ô trong bảng dữ liệu chỉ khi đáp ứng một số điều kiện.Chỉnh sửa ô điều kiện trong PrimeFaces datatable

Ban đầu tôi đã cố gắng <choose> để đạt được điều này:

<p:dataTable var="item" value="${bean.items}" editable="true" editMode="cell"> 
    <p:column headerText="column A"> 
     <c:choose> 
      <c:when test="${item.isEditable}"> 
       <p:cellEditor id="title"> 
        <f:facet name="output"> 
         <h:outputText value="#{item.title}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{item.title}"/> 
        </f:facet> 
       </p:cellEditor> 
      </c:when> 
      <c:otherwise> 
       <h:outputText value="#{item.title}"/> 
      </c:otherwise> 
     </c:choose> 
    </p:column> 
... 

nhưng nó không hoạt động. Một cách tiếp cận khác là sử dụng thuộc tính rendered:

<p:column headerText="column A"> 
    <p:cellEditor rendered="${item.isEditable}"> 
     <f:facet name="output"> 
      <h:outputText value="#{item.title}"/> 
     </f:facet> 
     <f:facet name="input"> 
      <p:inputText value="#{item.title}"/> 
     </f:facet> 
    </p:cellEditor> 
    <h:outputText value="#{item.title}" rendered="#{!item.isEditable}"/> 
</p:column> 

hoạt động tốt - người dùng chỉ có thể chỉnh sửa các ô được phép.

Nhưng ngay cả khi ô không thể chỉnh sửa, nó vẫn có lớp ui-cell-editing và trông giống như ô có thể chỉnh sửa cho người dùng.

Cách chính xác để áp dụng điều kiện cho chỉnh sửa ô là gì?

Cảm ơn bạn!

Trả lời

6

Để tìm hiểu đúng bài học của JSTL không thành công, nó không thành công vì lý do được giải thích trong câu trả lời sau: JSTL in JSF2 Facelets... makes sense? Tóm lại: #{item} không khả dụng tại thời điểm JSTL chạy.

Trở lại các câu hỏi cụ thể: đó là lớp phong cách được được đưa vào do sự kết hợp editMode="cell" và sự hiện diện vật lý của <p:cellEditor> thành phần trong <p:column>. Trình kết xuất đồ hoạ có thể trả về của PrimeFaces hoàn toàn không cân nhắc nếu <p:cellEditor> được hiển thị hay không. Nó chỉ hoàn toàn chèn lớp phong cách ui-editable-column mà lần lượt kích hoạt phong cách ui-cell-editing thông qua JS/jQuery. Bạn đang tìm kiếm đúng hướng cho giải pháp, JSTL có thể bổ sung/loại bỏ các thành phần JSF có điều kiện về mặt vật lý trong cây thành phần JSF, nhưng tiếc là nó sẽ không hoạt động trong cấu trúc này.

Đặt cược tốt nhất của bạn là đăng an issue report cho những người PrimeFaces, theo đó bạn yêu cầu không chỉ xem xét sự hiện diện vật lý của thành phần <p:cellEditor> mà còn là kết quả isRendered() của nó. Xét PrimeFaces phiên bản 3.5, đó sẽ là trong line 796 of DataTableRenderer class mà ban đầu trông như thế này (dòng mới giới thiệu cho dễ đọc):

String styleClass = selectionEnabled 
    ? DataTable.SELECTION_COLUMN_CLASS 
    : (column.getCellEditor() != null) 
     ? DataTable.EDITABLE_COLUMN_CLASS 
     : null; 

Và nên được sửa đổi như sau:

String styleClass = selectionEnabled 
    ? DataTable.SELECTION_COLUMN_CLASS 
    : (column.getCellEditor() != null && column.getCellEditor().isRendered()) 
     ? DataTable.EDITABLE_COLUMN_CLASS 
     : null; 

Nếu bạn không thể chờ đợi, trong khi đó bạn có thể gia hạn một trình kết xuất tùy chỉnh.

package com.example; 

import org.primefaces.component.datatable.DataTableRenderer; 

public class MyDataTableRenderer extends DataTableRenderer { 

    @Override 
    protected void encodeCell(FacesContext context, DataTable table, UIColumn column, String clientId, boolean selected) throws IOException { 
     // Copypaste here the original encodeCell() source code and make modifications where necessary. 
    } 

} 

Sau đó, để làm cho nó chạy, đăng ký nó như sau trong faces-config.xml:

<render-kit> 
    <renderer> 
     <description>Overrides the PrimeFaces table renderer with customized cell renderer.</description> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.DataTableRenderer</renderer-type> 
     <renderer-class>com.example.MyDataTableRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

cảm ơn bạn @BalusC Tôi chắc chắn sẽ cố gắng sử dụng renderer tùy chỉnh và gửi kết quả ở đây. Cảm ơn bạn rất nhiều cho câu trả lời toàn diện! – Meta

+0

Bạn được chào đón. – BalusC

+0

Cảm ơn bạn rất nhiều vì điều này, tôi sẽ làm việc trên một yêu cầu kéo để nhân rộng hành vi này. –

Các vấn đề liên quan