2013-04-16 7 views
5

Tôi tò mò về cách lấy số hàng của một phần tử bên trong <p:dataTable>.Nhận số hàng trong p: dataTable của phần tử động

<p:dataTable id="userDataTable" value="#{bean.rows}" rowIndexVar="rowIndex"> 
    <p:column headerText="RowCounter"> 
     <p:commandLink id="row#{rowIndex+1}" actionListener="#{bean.getRows}"> 
      <h:outputText value="Show Row #{rowIndex+1}" /> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

Bean:

public void getRows(ActionEvent ae) {     
    System.out.println(ae.getComponent().getId().toString()); 
} 

Luôn in row1, bất kể đó <p:commandLink> được nhấp. Tôi đang thiếu gì?

Trả lời

3

Đối với vấn đề cụ thể của bạn, việc chấp nhận id của thành phần JSF được đánh giá trong thời gian xây dựng chế độ xem. Tuy nhiên, #{rowIndex} chỉ được đặt trong thời gian hiển thị chế độ xem. Do đó, tại thời điểm này, thuộc tính id được đánh giá, #{rowIndex} không được đặt và mặc định là 0. Vấn đề này về cơ bản chính xác cùng một căn cứ như đã được trả lời và giải thích tại đây: JSTL in JSF2 Facelets... makes sense? Lưu ý rằng chỉ có chỉ một thành phần<p:commandLink>, không nhiều. Nó chỉ là nó được tái sử dụng nhiều lần trong quá trình tạo HTML (mọi lúc với cùng một thành phần ID!).

Để khắc phục, chỉ cần sử dụng id="row" thay thế. ID động không có ý nghĩa trong trường hợp cụ thể này. JSF đã automaticlaly prepend chỉ mục hàng (kiểm tra đầu ra HTML được tạo ra để xem nó). Tôi không chắc tại sao chính xác bạn incorrectly thought mà bạn cần phải chỉ định chỉ mục hàng tại đây theo cách thủ công, vì vậy thật khó để đề xuất giải pháp phù hợp vì có nhiều khả năng bạn thực sự không cần nó. Xem thêm How can I pass selected row to commandLink inside dataTable?

Đối với trường hợp bạn thực sự cần chỉ số liên tiếp, dưới đây là cách bạn có thể có được nó:

Integer rowIndex = (Integer) ae.getComponent().getNamingContainer().getAttributes().get("rowIndex"); 

Các UIComponent#getNamingContainer() trả về naming container cha mẹ gần gũi nhất đó là trong trường hợp cụ thể của bạn bảng dữ liệu riêng của mình , trong hương vị hoặc UIData do đó, thuộc tính rowIndex. Bạn cũng có thể làm như vậy, đó là một chút tự tài liệu hơn:

UICommand commandLink = (UICommand) ae.getComponent(); 
UIData dataTable = (UIData) commandLink.getNamingContainer(); 
Integer rowIndex = dataTable.getRowIndex(); 
+0

Cảm ơn bạn rất nhiều cho các gợi ý và dễ hiểu xplaination! Rất được đánh giá cao! – ctekk

+0

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