2012-10-15 27 views
6

tôi có thành phần hỗn hợp sau:có điều kiện làm cho thuộc tính nguyên tố trong một thành phần hỗn

<?xml version="1.0" encoding="UTF-8"?> 
<ui:component xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute required="true" name="field" /> 
     <composite:attribute required="true" name="value" /> 
     <composite:attribute required="false" name="size"/> 
    </composite:interface> 

    <composite:implementation> 
    ... 
      <div class="wrapper"> 
       <h:inputText value="#{cc.attrs.value}" 
        id="#{field.id}" 
        rendered="#{field.rendered}" 
        size="#{cc.attrs.size}"> 
       </h:inputText> 
       <h:messages for="#{field.id}" styleClass="errorMessage"/> 
      </div> 
    ... 
    </composite:implementation> 
</ui:component> 

Vấn đề là khi tôi đang sử dụng thành phần này mà không cần thiết lập thuộc tính size của nó, nó vẫn được trả lại như size=0 trong phần tử nhập html.

Điều tôi muốn là chỉ hiển thị thuộc tính lồng nhau h:inputText nếu thuộc tính đó có giá trị hợp lệ (ví dụ: không trống). Ngoài ra, tôi muốn phơi bày tất cả các thuộc tính của phần tử lồng nhau nếu chúng không được ghi đè một cách rõ ràng.

Làm cách nào có thể?

+0

Hãy cẩn thận khi gắn thẻ, thành phần tổng hợp không phải là thành phần tùy chỉnh. Xem thêm http://stackoverflow.com/questions/5704620/what-is-the-difference-between-custom-components-and-composite-components – BalusC

+0

Cảm ơn bạn đã sửa. Tôi biết điều đó nhưng tôi hơi bất cẩn, có lẽ tôi cần nghỉ ngơi vài phút: S –

Trả lời

10

Bạn có thể sử dụng JSTL <c:if> để xây dựng quan điểm có điều kiện và <f:attribute> để xác định một thuộc tính riêng biệt:

<h:inputText ...> 
    <c:if test="#{not empty cc.attrs.size}"> 
     <f:attribute name="size" value="#{cc.attrs.size}" /> 
    </c:if> 
</h:inputText> 

Một cách khác là để xác định một mặc định cho thuộc tính thành phần hỗn hợp:

<cc:attribute name="size" required="false" default="10" /> 
+0

Cảm ơn bạn! Nó hoạt động nhưng nó là lạ đối với tôi rằng nếu tôi thêm trực tiếp \t '' hoặc '' Tôi nhận được 'javax.servlet.ServletException: loại đối số không khớp' và nếu tôi thêm '' Tôi nhận được 'Trích dẫn mở được mong đợi cho thuộc tính" value "'. –

+0

Nó phải là một 'Integer', không phải' String'. – BalusC

+0

Có, nhưng làm thế nào để thêm một 'Integer' vào thuộc tính' value'? Với dấu ngoặc kép, nó được hiểu là 'Chuỗi', không có dấu ngoặc kép ngoại lệ khác. –

1

bổ sung tới bài đăng của BalusC:

Bạn phải sử dụng

type = "int" trong cc: attribute-tag:

cc: Tên thuộc tính = "maxlength" type = "int"

0

Tôi tin rằng có một phương pháp thay thế cho việc truy cập các thuộc tính. Tôi đã sử dụng điều này với JSF 2 khi truy cập vào một thuộc tính được đặt tên với một từ khóa dành riêng java.

{cc.attrs ['size']}

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