2012-08-23 28 views
5

Tôi có một JSP 2.0 <ui:component>, trong đó là <p:dataTable> với cột sử dụng Composite để hiển thị đường viền đặc biệt về một số nội dung. Bây giờ tôi cần phải xác định các <p:dataTabe> trong một thuộc tính ajax rendered được đặt trong nội dung.Làm cách nào để truy cập vào hộp chứa Đặt tên của Composite?

<ui:component> 
    <p:dataTable id="dataTable" var="userItem" ... /> 
    <p:column> 

     <my:borderBox id="borderBox"> 
      <p:commandButton 
       action="#{userController.doDelete(userItem.id)}" 
       value="delete" 
       update="?????"/> <!-- How to address the dateTable? --> 
     </my:borderBox> 

     </p:column> 
    </p:dataTable> 
<ui:component> 

BorderBox của tôi:

<html xmlns:composite="http://java.sun.com/jsf/composite" ...> 
    <composite:interface> 
     <composite:attribute name="styleClass" default="" type="java.lang.String"/> 
    </composite:interface> 

    <composite:implementation> 
     <h:panelGroup ...> 
     ... 
     <composite:insertChildren/> 
     </h:panelGroup> 
    </composite:implementation> 

Ý tưởng của tôi là sử dụng cái gì đó như

update=":#{component.namingContainer.parent.namingContainer.clientId}:dateTable

Nhưng component.namingContainer.parent vỉa là null.

Khi tôi thay thế <p:commandButton> với báo cáo này:

Parent ClientId 1: #{component} 
Parent ClientId 2: #{component.namingContainer} 
Parent ClientId 3: #{component.namingContainer.clientId} 

Parent ClientId 4: #{component.namingContainer.parent} 
Parent ClientId 5: #{component.namingContainer.parent.namingContainer} 

tôi nhận được kết quả này:

Parent ClientId 1: [email protected] 

Parent ClientId 2: [email protected] 
Parent ClientId 3: main_form:profilTabView:dataTable:0:borderBox 

Parent ClientId 4: 
Parent ClientId 5: 

Tôi không có ý tưởng những gì các vấn đề đó: mybey ý tưởng của tôi để xác định danh sách trình hoàn tất sai hoặc có một số sai lầm hoặc có một cách tốt hơn? (Nhưng tôi không thể sử dụng sửa chữa identifyer tuyệt đối cho dateTable!)

phiên bản: Primeface 3.2, cá móm 2.1.6 trên Glassfish 3.1.2

+1

Rất tiếc, tôi không sử dụng thẻ 'ui: component' nên tôi không biết nhiều về nó; Tôi thường sử dụng các thành phần tổng hợp mà bạn có thể tham chiếu từ một biểu thức EL trong thùng chứa đặt tên cha giống như '# {cc.parent.id}'. Tuy nhiên, tôi nghĩ rằng 'parent' là một biến dành riêng trong ngôn ngữ biểu thức EL vì vậy nó phải đơn giản như' # {parent.id} 'để truy xuất id vùng chứa đặt tên cha. –

+0

@maple_shaft: '' được sử dụng ngầm bởi các thành phần hỗn hợp. Do đó, nó sạch hơn để khai báo trực tiếp thay vì ''. – BalusC

+0

Bạn đang sử dụng phiên bản JSF impl/version và PF nào? – BalusC

Trả lời

1

Tôi có một cách giải quyết cho vấn đề này. Nếu bạn không thể tìm thấy giải pháp khác, bạn có thể sử dụng giải pháp thay thế. Giải pháp là sự kết hợp giữa jsf và javascript. Đối với bảng của bạn, bạn xác định tiện ích con (ví dụ: "myTable").

<p:dataTable id="dataTable" var="userItem" ... widgetVar="myTable"/> 

Đây là biến javascript toàn cầu có tên "myTable" được tạo. đối tượng tiện ích con này chứa id. Đối với các bạn lệnh nút (h: CommandButton không p: CommandButton) bạn xác định onklick sự kiện:

<h:commandButton id="deleteItem" action="#{userController.doDelete(userItem.id)}" 
value="delete" onclick="PrimeFaces.ab({formId:$(this).closest('form').attr('id'),source:this.id,process:'@all',update:myTable.id});return false;" /> 


formId - bạn nhập dưới dạng ID rõ ràng hoặc sử dụng Jquery chức năng của tôi
cập nhật - myTable.id là một Bảng ID (chính xác là trình bao bọc div)
quy trình - @all, @this, @form etc ..

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