2010-09-14 30 views
22

Tôi đang tìm kiếm một cách hỗ trợ để vẽ lại một phần của mã trong JSF, tôi thường sử dụng phương pháp này:Thay thế cho ui: đoạn trong JSF

<ui:fragment rendered="#{condition}"> 
    <h:outputText value="text 1"/> 
    <h:outputText value="text 2"/> 
    <h:outputText value="text 3"/> 
</ui:fragment> 

Từ ui: đoạn không hỗ trợ trả lại hầu hết IDE (như netBeans đánh dấu nó như là lỗi NHƯNG nó hoạt động vì trong JSF tham số được thừa hưởng.

Một cách để giải quyết này là sử dụng cấu trúc khác (ví dụ, nếu bạn sử dụng Seam), bạn có thể sử dụng

<s:div rendered="#{condition}"> 
    .... 
</s:div> 

Một cách khác là đặt kết xuất trong tất cả nội dung bên trong như sau:

<h:outputText value="text 1" rendered="#{condition}"/> 
<h:outputText value="text 2" rendered="#{condition}"/> 
<h:outputText value="text 3" rendered="#{condition}"/> 

Nhưng tôi không thích cách này vì bạn phải thêm kết xuất vào từng phần tử.

Một cách khác là sử dụng <c:if test="#{condtion}"> NHƯNG c: nếu loại bỏ các phần tử khỏi cây JSF và không phải những gì bạn luôn muốn làm đặc biệt nếu bạn sử dụng AJAX.

Các bạn có giải pháp khác không?

Trả lời

46

Kể từ ui:fragment không hỗ trợ render nhất của IDE (như Netbeans đánh dấu nó như là lỗi NHƯNG nó hoạt động vì trong JSF thông số được thừa kế)

Đây thực sự là một lỗi trong JSF 2.0 Facelets khai báo tệp thẻ (trong Mojarra, đó là tệp com/sun/faces/metadata/taglib/ui.taglib.xml). Thuộc tính rendered bị bỏ qua và thiếu trong khai báo tệp thẻ (và cũng trong số JSF 2.0 <ui:fragment> tag documentation), trong khi đó là thực sự là có trong số UIComponent. Việc xác thực IDE dựa trên các khai báo tệp thẻ và do đó nó đưa ra một lỗi xác nhận sai lạc. Sự cố này được khắc phục trong JSF 2.1, thuộc tính bị thiếu được thêm vào khai báo tệp thẻ (và cũng trong số JSF 2.1 <ui:fragment> tag documentation).

Nếu một trong hai chỉ phớt lờ những lời cảnh báo IDE hoặc nâng cấp lên JSF 2.1 không phải là một lựa chọn, sau đó bạn có thể xem xét sử dụng the <h:panelGroup> component thay vì:

<h:panelGroup rendered="#{condition}"> 
    <h:outputText value="text 1"/> 
    <h:outputText value="text 2"/> 
    <h:outputText value="text 3"/> 
</h:panelGroup> 

Nó ra không có gì anyway nếu bạn không xác định id, style , styleClass và các thuộc tính tương tự, nếu không một đơn giản <span> sẽ được hiển thị.

Nếu tất cả những gì bạn có là HTML thuần túy vani (nghĩa là không có thành phần JSF), thì bạn cũng có thể xem xét sử dụng <f:verbatim>.

<f:verbatim rendered="#{condition}"> 
    text 1 
    text 2 
    text 3 
</f:verbatim> 

Tuy nhiên, <f:verbatim>phản trong JSF 2.0 (do đó cũng có một lỗi tài liệu bằng cách này, các JSF 2.0 <f:verbatim> tag documentation không đề cập đến deprecation, nhưng JSF 2.1 <f:verbatim> tag documentation không).

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