2012-05-07 6 views
6

Ich benutze Primefaces 3 in JSF 2, um ein Suchfeld zu erstellen. Ich brauche ein Nicht-Standard-Attribut (x-Webkit-Sprache) mit dem Steuerelement hinzuzufügen, so dass Sie etwas davon haben würden ...Wie lässt JSF HTML-Attribute passieren

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

Da dieses Attribut nicht Teil der JSF autocomplete Kontrolle gibt mir ein 500 Fehler. Aber wenn ich es entferne, wird die Seite gut dargestellt. Im Allgemeinen, wie spezifizieren Sie Pass-Through-Attribute auf einem JSF-Tag, so dass sie ignoriert werden?

+0

bei dieser einen Blick http://stackoverflow.com/a/6675592/617373 – Daniel

Antwort

6

JSF by Design ignoriert alle benutzerdefinierten Attribute beim Rendern von HTML. Sie benötigen einen benutzerdefinierten Renderer. Dies ist bei PrimeFaces <p:autoComplete> (und allen anderen Komponenten) zum Glück relativ einfach. Es genügt, nur die renderPassThruAttributes()-Methode zu überschreiben, bei der Sie das neue Attribut, das Sie rendern möchten, in das attrs-Argument einfügen und schließlich an die Super-Methode delegieren.

z.

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

} 

Um es zu bekommen, um sie auszuführen, registrieren Sie als Webapp die folgt in 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> 

(die Komponente Familie und Renderer-Typ durch einen Blick auf den Quellcode AutoComplete Klasse herausfinden können, , sie sind da drin)

Nein, die @FacesRenderer Anmerkung einfach als COMPONENT_FAMILY und RENDERER_TYPE Konstanten angegeben funktioniert nicht, wenn der Zweck darin besteht, benutzerdefinierte Renderer zu überschreiben, die bereits in einem faces-config.xml registriert sind.

+0

Wäre es möglich, nur den Renderer Feuer für bestimmte Autocomplete-Komponenten zu haben? – Adam

+0

Nein. Sie müssten eine benutzerdefinierte UI-Komponente erstellen. Einfach PrimeFaces 'AutoComplete' erweitern und' getRendererType() 'überschreiben, um einen anderen Wert, z. 'com.example.MyAutoCompleteRenderer' sollte ausreichen. Registrieren Sie es in einer '.taglib.xml' Datei und ändern Sie' 'entsprechend. Verwenden Sie diese Komponente schließlich als ''. – BalusC

+0

Wo kann ich die Render-Klasse nachsehen, um h: commandLink zu erweitern, um benutzerdefinierte HTML-Attribute zu akzeptieren? –

0

Ich bin mir nicht sicher, ob das überhaupt möglich ist. Ich würde diese Attribute auf der Client-Seite mit Javascript oder jQuery hinzufügen.

Sie können EL-Ausdrücke in Ihren JavaScript-Code einfügen, wenn Sie Server-Side-Zeug integrieren möchten.

+4

das ist ein hässlicher hack –

1

Die meisten Tags können mit dem Attribut-Tag aus JSF-Ext erweitert werden.

<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> 

Sie können es über Maven konfigurieren:

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

JSF-Ext ist eine Bibliothek von http://www.intersult.com/wiki/page/JSF%20Ext

+0

dieses Maven-Projekt funktioniert nicht wie du es beschreibst! –

+0

Was genau nicht funktioniert, können Sie ein Beispiel geben? Ich verwende diese Funktion immer in produktiven Projekten. – Tires

+0

Wenn ich dies zu pom.xml hinzufüge, wird mein Persistenzkontext nicht mehr erkannt ... komische Sache, kann keine vernünftige Ursache finden – simonC