2012-04-30 21 views
9

Xin chào Tôi có mã này để có điều kiện làm cho các thành phần trong trang của tôi:vẽ có điều kiện trong JSF

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="one two" /> 
</h:commandButton> 

<p><h:outputFormat rendered="#{Bean.answer=='one'}" id="one" value="#{messages.one}"/></p> 
<p><h:outputFormat rendered="#{Bean.answer=='two'}" id="two" value="#{messages.two}"/></p> 

Nó được câu trả lời và làm cho các thành phần nhưng để nhìn thấy nó trên trang của mình, tôi cần phải làm mới trang. Làm cách nào để khắc phục sự cố này? Bất kỳ đề xuất?

Trả lời

14

Thuộc tính rendered của thành phần JSF là cài đặt phía máy chủ kiểm soát việc JSF có tạo HTML mong muốn hay không.

Thuộc tính của thẻ render phải trỏ đến ID khách hàng (tương đối) của phần tử HTML do JSF tạo JavaScript có thể lấy document.getElementById() từ cây DOM HTML để thay thế nội dung của nó theo yêu cầu ajax.

Tuy nhiên, vì bạn đang chỉ định ID ứng dụng của phần tử HTML mà JSF không bao giờ hiển thị (do renderedfalse) nên JavaScript không thể tìm thấy nó trong cây DOM HTML.

Bạn cần bọc nó trong thành phần thùng chứa luôn luôn hiển thị và do đó luôn có sẵn trong cây DOM HTML.

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="messages" /> 
</h:commandButton> 

<p> 
    <h:panelGroup id="messages"> 
     <h:outputFormat rendered="#{Bean.answer=='one'}" value="#{messages.one}"/> 
     <h:outputFormat rendered="#{Bean.answer=='two'}" value="#{messages.two}"/> 
    </h:panelGroup> 
</p> 

Không liên quan cho vấn đề cụ thể, bạn đã có một sai lầm thiết kế khả thi. Tại sao bạn không chỉ cần tạo một tài sản mà bạn thiết lập với thông điệp mong muốn trong phương pháp hành động thay thế, do đó bạn chỉ có thể sử dụng #{Bean.message}:

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="message" /> 
</h:commandButton> 

<p> 
    <h:outputFormat id="message" value="#{Bean.message}" /> 
</p> 
+0

Cảm ơn bạn đã trả lời. Những gì tôi đã làm là tôi đã sử dụng render = "@ form" trong biểu mẫu của tôi và nó hoạt động. Tôi sẽ thử mặc dù những gì bạn đề nghị là tốt. – sandra

+0

Điều đó thực sự cũng sẽ hoạt động, miễn là đó là phụ huynh của thành phần được * luôn luôn * trả về (chính xác như câu trả lời của tôi đang cố gắng cho bạn biết). Có lẽ chỉ có một chi phí không cần thiết nếu hình thức chứa 10 thành phần khác mà không cần phải được cập nhật ở tất cả, ví dụ. – BalusC

+0

chúng ta có thể thêm điều kiện trong ajax render? –

-1
style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}" 
+0

Tốt hơn là không hiển thị mục đó, thay vì không hiển thị nó. – dwjohnston

3

Tôi biết nó không phải là điểm trung tâm của câu hỏi, nhưng khi tôi gặp vấn đề này nhiều lần trong quá khứ, tôi chỉ đăng nó ở đây để giúp những người khác đang cần. Đối với những người sử dụng PrimeFaces, có một thành phần trong PrimeFaces Extension được gọi là Switch.

Đôi khi bạn cần hiển thị các đầu ra hoặc thành phần khác nhau tùy thuộc vào giá trị. Thông thường bạn có thể đạt được điều này bằng cách sử dụng thẻ ui:fragment. Với thẻutil bạn sẽ không phải khai báo các thẻ ui:fragment, với các séc khác nhau như ui:fragment rendered="#{!empty someController.value}", nữa.

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