2012-05-07 28 views
6

Używam Primefaces 3 w JSF 2, aby utworzyć pole wyszukiwania. Muszę dodać niestandardowy atrybut (x-webkit-speech) do kontroli więc trzeba coś takiego ...Jak pozwolić JSF przejść przez atrybuty HTML

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

Od tego atrybutu nie jest częścią kontroli JSF autouzupełniania daje mi błąd 500. Ale kiedy ją usuwam, strona będzie w porządku. Na ogół, w jaki sposób określasz przekazywanie atrybutów w tagu JSF, aby były one ignorowane?

+0

spojrzeć na to http://stackoverflow.com/a/6675592/617373 – Daniel

Odpowiedz

6

JSF według projektu ignoruje wszystkie niestandardowe atrybuty podczas renderowania HTML. Potrzebujesz niestandardowego renderera. Jest tak w przypadku PrimeFaces <p:autoComplete> (i wszystkich innych komponentów) na szczęście stosunkowo proste. Wystarczy zastąpić tylko metodę renderPassThruAttributes(), w której dodajesz nowy atrybut, który chcesz renderować do argumentu attrs i ostatecznie przekazujesz do super metody.

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

} 

Aby go uruchomić, zarejestrować go w następujący sposób Twój webapp na 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> 

(można dowiedzieć się składnik rodziny i renderujący typ patrząc na kodzie źródłowym AutoComplete klasie , są one określone jako COMPONENT_FAMILY i RENDERER_TYPE stałych tam)

nie, po prostu @FacesRenderer adnotacji nie działa, gdy celem jest zastąpienie niestandardowych renderers, które są już zarejestrowane w faces-config.xml.

+0

Czy możliwe byłoby posiadanie tylko renderera w przypadku niektórych składników autouzupełniania? – Adam

+0

Nie. Musisz utworzyć niestandardowy składnik interfejsu użytkownika. Wystarczy rozszerzyć "Autouzupełnianie" PrimeFaces i zastąpić 'getRendererType()', aby zwrócić inną wartość, np. "com.example.MyAutoCompleteRenderer" powinno być wystarczające. Zarejestruj go w pliku '.taglib.xml' i zmień odpowiednio' ". Na koniec użyj tego komponentu zamiast ''. – BalusC

+0

gdzie mogę wyszukać klasę renderowania, aby rozszerzyć h: polecenieLink, aby zaakceptować niestandardowe atrybuty html? –

0

Nie jestem pewien, czy jest to w ogóle możliwe. Dodałabym te atrybuty po stronie klienta, używając javascript lub jQuery.

Możesz wstawić el wyrażenia do kodu javascript, jeśli chcesz zintegrować rzeczy po stronie serwera.

+4

to jest paskudny hack –

1

Najbardziej znaczące można rozszerzyć za pomocą atrybutu Tag z 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> 

Można skonfigurować go za pomocą Maven:

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

JSF-EXT jest biblioteką z http://www.intersult.com/wiki/page/JSF%20Ext

+0

Ten projekt maven nie działa tak, jak opisujesz to! –

+0

Co dokładnie nie działa, czy mógłbyś podać przykład? Używam tej funkcji cały czas w produktywnych projektach. – Tires

+0

kiedy dodaję to do pom.xml mój kontekst utrwalania nie jest już rozpoznany ... dziwna rzecz, nie mogę znaleźć żadnej uzasadnionej przyczyny – simonC

Powiązane problemy