Tôi đang viết thành phần tùy chỉnh tự động hoàn thành dưới dạng bài tập học tập với JSF 2.1.3. Ý tưởng (có lẽ là khá quen thuộc) là nhập một số văn bản vào và thành phần đầu vào và trình bày một hộp danh sách với các giá trị phù hợp. Ý tưởng là để có sự kiện javascript khóa trên đầu vào gọi jsf.ajax.request() để cập nhật thành phần. Cho đến nay tôi đã có một thành phần mà tôi có thể bao gồm như này:JSF thành phần tùy chỉnh mất tiêu điểm đầu vào trên bản cập nhật ajax
<mycc:autocomplete id="myauto" searchMethod="#{bean.doSearch}"/>
này làm cho html như thế này:
<span id="myauto">
<input type="text" id="myauto_input" name="myauto_input"
onkeyup="com.myco.ajaxRequest(this, event)"/>
<select id="myauto_listbox" name="myauto_listbox">
<option value="1st">First</option>
<option value="2nd">Second</option>
</select>
</span>
Các com.myco.ajaxRequest() chức năng javascript (KeyUp) thực hiện này:
jsf.ajax.request(comp, null, {
execute: 'myauto',
render: 'myauto'
});
vì vậy, bởi vì tôi muốn xây dựng lại và rerender ListBox với những gợi ý danh sách, tôi lại vẽ các thành phần tùy chỉnh 'myauto'. Bằng cách chỉ định thực hiện: 'myauto' phương thức decode() thực hiện và tôi có thể nhận được giá trị đầu vào. Bằng cách chỉ định hiển thị: phương thức 'myauto' mã hóa ...() thực thi để tạo lại html.
Điều này là tốt nhưng vì tôi đang hiển thị phụ huynh của thành phần myauto_input Tôi mất tiêu điểm đầu vào mỗi khi sự kiện khóa bàn phím kích hoạt.
Nếu tôi chỉ định một cái gì đó như hiển thị: 'myauto_listbox' (Tôi chỉ thực sự muốn đặt lại hộp danh sách sau khi tất cả) vấn đề là các phương thức mã hóa ...() không thực thi, vì chúng dành cho toàn bộ thành phần tùy chỉnh, không chỉ là hộp danh sách. Và nó sẽ là một trong các phương thức mã hóa ...() mà tôi xây dựng lại hộp danh sách chứa các đề xuất.
Các thành phần mở rộng UIInput và tôi tạo đánh dấu trong một renderer riêng (componentFamily = "javax.faces.Input") trong phương pháp encodeEnd() (vì vậy này luôn chạy sau khi bất kỳ chuyển đổi cung cấp - chưa thực hiện). Tôi giả sử mà buộc tập trung từ javascript là một hack khủng khiếp và để tránh.
Tôi không chắc chắn nên đi đâu với điều này, nhưng tôi nghi ngờ rằng những gì tôi thấy chỉ ra rằng tôi đang tiếp cận điều này một cách sai lầm bằng cách nào đó. Nếu bất cứ ai sẽ là đủ tốt để chỉ cho tôi đúng hướng tôi rất muốn đánh giá cao nó.