2012-08-12 41 views
6

tôi có trang đơn giản này:Primefaces DataTable, tải lười biếng và CommandButton mỗi hàng

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel}" var="elem" lazy="true" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

CommandButton bên DataTable không được làm việc, chỉ cần làm mới trang. nhưng bên ngoài đang hoạt động.

nếu tôi thay đổi valuelazy theo cách này:

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

các CommanButton bên DataTable công trình như một say mê.

ai đó biết lý do tại sao?

có phải là lỗi không?

tôi trên

  • Glassfish 3.1.2
  • JSF 2.1.11 (cá móm)
  • PrimeFaces 3.4-SNAPSHOT

Trả lời

7

phát hiện ra rằng DataModel lười biếng phải là cùng một ví dụ về yêu cầu postback, ngay cả một thể hiện mới với các giá trị rất giống nhau sẽ không hoạt động. do đó, nó phải được cung cấp từ ít nhất một hạt đậu @ViewScoped.

+1

Đây không phải là hoàn toàn đúng: đó là hữu ích nếu cùng một ví dụ của 'LazyDataModel' được tìm thấy trong phiên bằng cách sử dụng '@ ViewScoped', nhưng bạn cũng có thể sử dụng' @ RequestScoped'. Vấn đề là phương thức 'isRowAvailable()' phải trả về true khi nó được đánh giá trong 'APPLY_REQUEST_VALUES' và trường' pageSize' phải giữ một giá trị lớn hơn 0. Tôi đã đạt được điều này bằng cách mở rộng 'LazyDataModel' trong khi nạp chồng hai phương thức:' isRowAvailable() ', ở đây tôi gọi' load (...) 'và áp dụng kết quả cho' setWrappedData() 'và phương thức thứ hai' setRowIndex (int rowIndex) 'nơi tôi đặt' pageSize' thành mặc định – uvo

1

Đã bốn năm kể từ khi câu hỏi này được đăng, nhưng vấn đề vẫn còn vi trong PrimeFaces 6.0.

Tôi sẽ đăng một cách giải quyết cho những người không muốn (hoặc không thể) sử dụng hạt ViewScoped.

Tiền đề là: "bạn không thể đặt bất kỳ mục" ajaxified "nào bên trong một dữ liệu lười ràng buộc ràng buộc với công cụ RequestScoped". Không bao giờ. Hãy ghi nhớ rằng bất cứ điều gì mà ném một cuộc gọi ajax sẽ không bao giờ làm việc.

Vì vậy, bước đầu tiên là thực hiện cuộc gọi ajax bên ngoài dữ liệu. Chúng tôi sẽ làm điều này bằng cách sử dụng RemoteComand. Bạn có thể đặt RemoteCommand này ở bất kỳ đâu bên ngoài DataTable (bên trong một biểu mẫu, tất nhiên)

<p:remoteCommand name="remoteCall" action="#{bean.doStuff()}"> 
</p:remoteCommand> 

Bây giờ, tất cả những gì chúng ta phải làm là gọi RemoteCommand này từ bên trong DataTable. Tôi đang sử dụng một liên kết để thực hiện các cuộc gọi javascript, nhưng bạn có thể sử dụng một nút hoặc bất cứ điều gì bạn thích:

<p:column> 
    <p:link value="#{item.id}" href="#" onclick="remoteCall([{name:'id', value:#{item.id}}])"> 
    </p:link> 
</p:column> 

Liên kết này cung cấp một cách để gọi hàm javascript "remoteCall" sẽ thực hiện các cuộc gọi ajax để "bean.doStuff()". Lưu ý rằng sự kiện onClick không chỉ chứa cuộc gọi javascript đến "remoteCall" mà còn chứa một mảng tham số chỉ với một tham số, có tên là "id" với một giá trị "# {item.id}". Điều này sẽ cho phép RemoteCommand gửi một tham số có tên là "id" tới bean sao lưu.

Bên trong phương pháp "doStuff" bạn sẽ phải lấy lại "id" tham số giá trị:

public void doStuff() { 

    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"); 

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