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 rendered
là false
) 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>
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
Đ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
chúng ta có thể thêm điều kiện trong ajax render? –