2012-09-26 34 views
5

Tôi đang duy trì một ứng dụng Ajax JSF2 và chúng tôi đang sử dụng nhiều thẻ h:commandLinksf:ajax cho tất cả các hành động - luôn chỉ hiển thị lại những gì cần thiết.Làm thế nào để thay đổi thuộc tính standard href = "#" của h: commandLink?

này dĩ nhiên phá vỡ hoạt động dự kiến ​​cho người sử dụng khi thực hiện một nhấp chuột phải vào liên kết và chọn "Mở liên kết trong tab mới" vv

Tôi hiểu rằng f: lực lượng ajax các atribute href của kết quả là a phần tử là # và thực hiện tất cả các yêu cầu ma thuật trong chức năng onclick - bây giờ tôi muốn cung cấp hỗ trợ dự phòng cho hành động "Open Link ..." bằng cách đặt một số liên kết có ý nghĩa vào thuộc tính href của thẻ <a> .

Điều này sẽ không phá vỡ hành vi onclick "bình thường" khi javascript được tạo luôn hoàn thành với return false; nhưng sẽ cho phép tôi gửi người dùng đến một số trang bằng yêu cầu GET bình thường trong trường hợp họ muốn mở liên kết trong cửa sổ mới .

Có cách nào để thực hiện việc này không? Hoặc ai đó có thể chỉ cho tôi đi đúng hướng về nơi trong vòng đời của JSF tôi sẽ phải nhảy vào để làm điều này có thể sử dụng một người nghe pha?

Trả lời

2

Đơn giản nhất là mở rộng com.sun.faces.renderkit.html_basic.CommandLinkRenderer và ghi đè phương thức renderAsActive() tương ứng. Mojarra là mã nguồn mở, chỉ cần sao chép phương thức và chỉnh sửa dòng có mã là writer.write("href", "#", "href"). Thay thế chuỗi "#" cho phù hợp với thông tin chi tiết của bạn.

public class MyCommandLinkRenderer extends CommandLinkRenderer { 

    @Override 
    protected void renderAsActive(FacesContext context, UIComponent command) throws IOException { 
     // ... 
    } 

} 

Để làm cho nó chạy, đăng ký nó như sau trong faces-config.xml:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Command</component-family> 
     <renderer-type>javax.faces.Link</renderer-type> 
     <renderer-class>com.example.MyCommandLinkRenderer</renderer-class> 
    </renderer> 
</render-kit> 

Lưu ý rằng các cặp vợ chồng này chặt chẽ renderer của bạn để cá móm. Để thực thi JSF độc lập, bạn cần phải tạo một trình kết xuất hoàn toàn mới thay vì mở rộng một lớp trình kết xuất cụ thể của Mojarra.


Không liên quan cho vấn đề cụ thể, xem xét đọc When should I use h:outputLink instead of h:commandLink?

+0

cảm ơn bạn BalusC, mở rộng CommandLinkRenderer làm việc một cách hoàn hảo để đạt được kết quả mong muốn. – bxr

+0

Bạn được chào đón. – BalusC

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