Hinzufügen von Benutzerdefinierten Attributen Primefaces Autocomplete-Komponente in JSF
Fragte ich über pass-through-Attribute in einem andere Frage und fand, ich könnte eine custom-renderer für die <p:autocomplete>
Komponente, aber das problem ist, mein custom renderer verwendet werden würde, für jedes p:autocomplete in meinem Projekt (site-wide). Daher habe ich gewählt, um eine benutzerdefinierte Komponente erstellen, die erweitert org.primefaces.component.autocomplete.AutoComplete
und fügt die erforderlichen Attribute für das Textfeld.
Mein Erster Gedanke war, fügen Sie einen Konstruktor, aber es scheint nicht zu funktionieren, da das Attribut anzeigen, null ist an dieser Stelle:
@FacesComponent("com.mycomponents.SiteSearch")
public class SiteSearch extends AutoComplete {
public SiteSearch() {
Map<String,Object> attrs = getAttributes();
attrs.put("x-webkit-speech", null);
attrs.put("x-webkit-grammer", "builtin:search");
attrs.put("onwebkitspeechchange", "this.form.submit();");
attrs.put("placeholder", "Enter a Search Term");
}
}
Meine andere gedacht war, lassen Sie diese benutzerdefinierte Komponente leer ist (leere Klasse) und geben Sie eine benutzerdefinierte renderer, erweitert org.primefaces.component.autocomplete.AutoCompleteRenderer
und ändern Sie die Attribute vorhanden.
Nachdem alles gesagt und getan, ich muss nur einen Weg, um diese Attribute zu trennen, um diesem ein Textfeld, so nur darum, einem custom-renderer auf der p:autoComplete ist nicht zur Arbeit zu gehen (es sei denn, vielleicht kann ich renderType= Attribut für dieses p:autoComplete?).
- irgendwelche Ideen?
- War gerade Serien (House MD jetzt). Haben Sie ein wenig Geduld 🙂
- Haha. Keine Probleme. Ich denke, wenn ich sehe, wie eine JSF-Frage, die ich einfach automatisch davon aus, dass dein ist die Antwort, ohne auch nur einen Blick. Kann mir jemand sagen, JSF ninja?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine bestimmte Komponente verwendet einen anderen renderer als
<p:autoComplete>
dann kann man wirklich nicht gehen, um das erstellen einer benutzerdefinierten Komponente mit der eigenen Familie und Komponente geben. Sie kann immer noch nur die Erweiterung der PrimeFacesAutoComplete
(und dessen renderer) zu speichern, boilerplate-code.In die benutzerdefinierte Komponente verwenden, müssen Sie die Getter für die Attribute. Sie konnte so gut angeben setter als gut, so können Sie immer setzen die Standardeinstellung der Werte aus der view-Seite. Diese Getter/setter sollte wiederum delegieren zu
StateHelper
.Es gibt nur ein kleines problem mit
x-webkit-*
Attribute. Die-
ist eine illegale Zeichen in Java-Bezeichner. So haben Sie zum umbenennen der Getter/setter und ändern Sie den renderer etwas wie der standard-renderer basiert auf dem component name der Eigenschaft wird genau das gleiche wie das tag-Attribut name. Update: ich verstehe, dassx-webkit-speech
sollte nur dargestellt werden, wie Sie ist (also keine getter/setter notwendig) und dassx-webkit-grammer
ist tatsächlich ein Tippfehler, es solltex-webkit-grammar
.Hier ist, wie die
SiteSearch
Komponente kann wie folgt Aussehen:Bitte beachten Sie, dass die Getter haben alle default-Werte angegeben. Wenn die
eval()
zurücknull
, dann wird der default-Wert zurückgegeben, statt. Ich habe auch neutralisiert die Namen der attribute etwas, so dass es wiederverwendet werden kann für eine zukünftige nicht-webkit-Browsern nur durch ändern der renderer entsprechend.Und hier ist, wie die
SiteSearchRenderer
renderer Aussehen sollte für die oben genannten Komponente:In der Ansicht, wir brauchen natürlich, um es zu registrieren als ein tag. Erstellen Sie eine
/WEB-INF/my.taglib.xml
Datei:Beachten Sie, dass Sie nicht brauchen, ein
<renderer>
imfaces-config.xml
für mehr. Die@FacesRenderer
annotation kann nur tun, Ihre Arbeit auf echten benutzerdefinierten Komponenten. So entfernen Sie die<renderer>
Eintrag infaces-config.xml
die Sie erstellt basierend auf Ihrer vorherigen Frage.Nun sagen, JSF, du hast eine custom-taglib, die von den folgenden context-param in
web.xml
:Schließlich können Sie es verwenden, wie folgt:
Können Sie auch zusätzliche Attribute angeben, die die Standardeinstellungen außer Kraft setzen in der Komponente festgelegt:
Für IDE mit autocomplete auf Attribute, müssten Sie angeben, jedes als separate
<attribute>
im<tag>
Erklärung in dermy.taglib.xml
.