2011-01-25 23 views
7

Tôi đang sử dụng các dấu phẩy và giá trị dữ liệu của nó. Một vài cột là ngày hoặc tiền tệ. Nếu tôi cố gắng lọc chúng, có những hành vi khó xử. Khi tôi bắt đầu gõ các công trình lọc cho đến khi dấu phân cách đầu tiên (dấu chấm cho ngày ví dụ, do đó, nó chỉ lọc cho 11. ký tự tiếp theo để cho bảng hiển thị không có mục nhập).jsf sẽ xử lý các vấn đề lọc có thể định dạng được

Có thể áp dụng bộ chuyển đổi dữ liệu không?

Đây là mã của tôi bây giờ:

<p:column filterBy="#{cou.startDate}" 
    headerText="#{text['date']}" 
    filterMatchMode="contains" 
    sortBy="#{cou.startDate}" > 
     <h:outputText value="#{cou.startDate}" > 
      <f:convertDateTime pattern="dd.MM.yyyy" /> 
     </h:outputText> 
</p:column> 

Trả lời

2

Theo như tôi biết, bạn không thể sử dụng một bộ chuyển đổi cho giá trị bộ lọc. Bạn có thể, tuy nhiên, đối phó với điều đó trong logic bean/service/dao của bạn.

Bạn có thể mã hóa logic của mình và sử dụng SimpleDateFormat để phân tích giá trị nếu cột bộ lọc khớp với tên nhất định như startDate hoặc endDate. Một cách tiếp cận chung chung hơn sẽ là sử dụng sự phản chiếu để có được Class liên kết với cột và sử dụng SimpleDateFormat nếu nó là Date, DecimalFormat nếu nó là một số và vân vân.

Một cách tự nhiên nếu bạn đang truyền truy vấn đó vào cơ sở dữ liệu, bạn sẽ không thể sử dụng toán tử tương tự. Nếu bạn đang sử dụng một số bạn sẽ cần phải so sánh cho bình đẳng (cùng áp dụng cho ngày). Nếu bạn đang tìm kiếm những thứ trong bộ nhớ, bạn sẽ phải thay đổi logic một chút. Nhưng nó không quá tệ. Nếu bạn có thể đăng một số mã bean/dịch vụ sao lưu của bạn, tôi đoán tôi có thể hữu ích hơn một chút;)

2

Hiện chưa có cơ chế bộ lọc ngày được tạo sẵn ở thủ đô, nhưng có khả năng lọc theo ngày tháng sử dụng bộ lọc tùy chỉnh. Bạn sẽ phải xác định một khía cạnh tiêu đề cho cột và sử dụng ajax của bạn kêu gọi lọc "bằng tay", nhưng nó làm việc:

<f:facet name="header">DateRange 
    <div> 
    <p:calendar id="from" value="#{bean.from}" styleClass="calendarFilter"> 
     <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/> 
    </p:calendar> 
    <p:calendar id="to" value="#{bean.to}" styleClass="calendarFilter"> 
     <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/> 
    </p:calendar> 
    </div> 
</f:facet> 
3

Thay vì trực tiếp bằng cách sử dụng cou.startDate từ mô hình, bạn thay vì có thể làm như sau:

Tạo thuộc tính tạm thời mới trong lớp mô hình.

@Transient 
private String dateForFilter; 
public String getDateForFilter() { 
return dateForFilter; 
} 
public void setDateForFilter(String dateForFilter) { 
this.dateForFilter = dateForFilter; 
} 

Tạo logic dưới đây trước khi trả về mô hình dữ liệu.

public List<Item> getDataModel() { 
    List<Item> lstItem = serviceClass.loadItem(userid); 
    for (Item item : lstItem) { 
     DateFormat dateFormat = null; 
     Date date = item.getDate; 
     dateFormat = new SimpleDateFormat("MM/dd/yyyy kk:mm"); 
     item.setDateForFilter(dateFormat.format(date)); 
    } 

    return lstItem; 
} 

Cập nhật XHTML của bạn để sử dụng thuộc tính dateForFilter.

<p:column filterBy="#{item.dateForFilter}"> 
    <f:facet name="header"> 
    Transaction Date 
    </f:facet> 
    <h:outputText value="#{item.dateForFilter}" /> 
</p:column> 

Lưu ý: Bạn chỉ có thể sử dụng nếu bạn không sử dụng ngày để cập nhật nội dung của lớp mô hình.

HTH.

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