2012-05-07 9 views
6

Estoy utilizando Primefaces 3 en JSF 2 para crear un cuadro de búsqueda. Tengo que añadir un atributo no estándar (x-webkit-speech) para el control por lo que tendría algo como esto ...Cómo dejar que JSF pase a través de los atributos HTML

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

Desde este atributo no es parte de la JSF control de AutoComplete me da un error 500 Pero cuando lo elimino, la página se muestra bien. En general, ¿cómo se especifican los atributos de paso a través en una etiqueta JSF para que se ignoren?

+0

echar un vistazo a este http://stackoverflow.com/a/6675592/617373 – Daniel

Respuesta

6

JSF por diseño ignora todos los atributos personalizados al representar HTML. Necesitas un renderizador personalizado. Esto es en el caso de PrimeFaces <p:autoComplete> (y todos los demás componentes) afortunadamente relativamente simple. Es suficiente anular solo el método renderPassThruAttributes() en el que agrega el nuevo atributo que desea representar en el argumento attrs y finalmente delega en el método super.

E.g.

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); 
    } 

} 

Para conseguir que se ejecute, lo registra como sigue en su webapp 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> 

(se puede averiguar la familia y procesador de tipo de componente de mirar el código fuente de AutoComplete clase , que están especificados como COMPONENT_FAMILY y RENDERER_TYPE constantes de allí)

No, la anotación simplemente @FacesRenderer no funcionará cuando el propósito es anular los renderizadores personalizados que ya están registrados en un faces-config.xml.

+0

¿Sería posible tener solo el fuego del renderizador para ciertos componentes de autocompletar? – Adam

+0

No. Tendría que crear un componente de interfaz de usuario personalizado. Simplemente ampliando PrimeFaces 'AutoComplete' y reemplazando' getRendererType() 'para devolver un valor diferente, p. 'com.example.MyAutoCompleteRenderer' debería ser suficiente. Regístrelo en un archivo '.taglib.xml' y cambie' 'en consecuencia. Finalmente use ese componente en su lugar como ''. – BalusC

+0

¿dónde puedo buscar la clase de representación para extender h: commandLink para aceptar atributos html personalizados? –

0

No estoy seguro si esto es posible en absoluto. Agregaría esos atributos en el lado del cliente usando javascript o jQuery.

Puede poner las expresiones el en su código javascript si desea integrar cosas del lado del servidor.

+4

esto es un hack desagradable –

1

La mayoría de las etiquetas se pueden extender, utilizando la etiqueta de atributo de 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> 

se puede configurar a través de Maven:

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

JSF-Ext es una biblioteca de http://www.intersult.com/wiki/page/JSF%20Ext

+0

¡este proyecto de maven no funciona como usted lo describe! –

+0

¿Qué es exactamente lo que no funciona? ¿Podría darnos un ejemplo? Estoy usando esta característica todo el tiempo en proyectos productivos. – Tires

+0

cuando agrego esto a pom.xml mi contexto de persistencia ya no se reconoce ... cosa extraña, cann no encuentra ninguna causa razonable – simonC

Cuestiones relacionadas