2012-05-07 47 views
6

Tôi đang sử dụng Primefaces 3 trong JSF 2 để tạo một hộp tìm kiếm. Tôi cần phải thêm một thuộc tính phi tiêu chuẩn (x-webkit-speech) để kiểm soát, do đó bạn sẽ có một cái gì đó như thế này ...Cách để JSF chuyển qua các thuộc tính HTML

<p:autoComplete x-webkit-speech="x-webkit-speech" ... /> 

Kể từ khi thuộc tính này không phải là một phần của sự kiểm soát JSF AutoComplete mang lại cho tôi lỗi 500. Nhưng khi tôi xóa nó, trang sẽ hiển thị tốt. Nói chung, làm cách nào để bạn chỉ định truyền qua các thuộc tính trên thẻ JSF để chúng bị bỏ qua?

+0

hãy xem này http://stackoverflow.com/a/6675592/617373 – Daniel

Trả lời

6

JSF theo thiết kế sẽ bỏ qua tất cả các thuộc tính tùy chỉnh khi hiển thị HTML. Bạn cần một trình kết xuất tùy chỉnh. Đây là trường hợp của PrimeFaces <p:autoComplete> (và tất cả các thành phần khác) may mắn tương đối đơn giản. Nó đủ để ghi đè lên chỉ là phương pháp renderPassThruAttributes() trong đó bạn thêm thuộc tính mới mà bạn muốn hiển thị đối số attrs và cuối cùng ủy quyền cho phương thức siêu.

Ví dụ:

package com.example; 

import java.io.IOException; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 

import org.primefaces.component.autocomplete.AutoCompleteRenderer; 

public class MyAutoCompleteRenderer extends AutoCompleteRenderer { 

    @Override 
    protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException { 
     String[] newAttrs = new String[attrs.length + 1]; 
     System.arraycopy(attrs, 0, newAttrs, 0, attrs.length); 
     newAttrs[attrs.length] = "x-webkit-speech"; 
     super.renderPassThruAttributes(facesContext, component, newAttrs); 
    } 

} 

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

<render-kit> 
    <renderer> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.AutoCompleteRenderer</renderer-type> 
     <renderer-class>com.example.MyAutoCompleteRenderer</renderer-class> 
    </renderer> 
</render-kit> 

(bạn có thể tìm hiểu các gia đình và renderer loại thành phần bằng cách nhìn vào mã nguồn của AutoComplete lớp , chúng được chỉ định là COMPONENT_FAMILYRENDERER_TYPE hằng số trong đó)

Không, chỉ cần chú thích @FacesRenderer sẽ không hoạt động khi mục đích là ghi đè lên các trình kết xuất tùy chỉnh theo các đường dẫn đã được đăng ký trong một faces-config.xml.

+0

Nó sẽ có thể chỉ có lửa renderer cho một số thành phần tự động hoàn thành? – Adam

+0

Không. Bạn cần phải tạo một thành phần giao diện người dùng tùy chỉnh. Chỉ cần mở rộng 'AutoComplete' của PrimeFaces và ghi đè 'getRendererType()' để trả về một giá trị khác, ví dụ: 'com.example.MyAutoCompleteRenderer' phải đủ. Đăng ký nó trong một tập tin '.taglib.xml' và thay đổi' 'cho phù hợp. Cuối cùng, sử dụng thành phần đó thay vì ''. – BalusC

+0

nơi tôi có thể tra cứu lớp kết xuất để mở rộng h: commandLink để chấp nhận các thuộc tính html tùy chỉnh? –

0

Tôi không chắc chắn liệu điều này có thể xảy ra hay không. Tôi sẽ thêm các thuộc tính đó ở phía máy khách bằng cách sử dụng javascript hoặc jQuery.

Bạn có thể đặt các biểu thức el vào mã javascript của mình nếu bạn muốn tích hợp các công cụ phía máy chủ.

+4

đây là một hack khó chịu –

1

Hầu hết các Thẻ có thể được mở rộng, sử dụng Thẻ thuộc tính từ JSF-Ext.

<html xmlns:h="http://java.sun.com/jsf/html" xmlns:e="http://java.sun.com/jsf/ext"> 
    <!-- ... --> 
    <h:inputText id="name" value="#{bean.name}"> 
     <e:attribute name="placeholder" value="My Name"/> 
    </h:inputText> 
    <!-- ... --> 
</html> 

Bạn có thể cấu hình nó qua maven:

<dependency> 
    <groupId>com.intersult</groupId> 
    <artifactId>jsf-ext</artifactId> 
    <version>2.2.0.1</version> 
</dependency> 

JSF-Ext là một thư viện từ http://www.intersult.com/wiki/page/JSF%20Ext

+0

dự án maven này không hoạt động giống như bạn mô tả nó! –

+0

Chính xác những gì không hoạt động, bạn có thể cung cấp một ví dụ không? Tôi đang sử dụng tính năng này mọi lúc trong các dự án sản xuất. – Tires

+0

khi tôi thêm điều này vào pom.xml ngữ cảnh kiên trì của tôi không được nhận ra nữa ... điều kỳ lạ, không thể tìm thấy bất kỳ nguyên nhân hợp lý nào – simonC

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