Eines der robusten Dinge, die Sie bei der Anpassung der Primefaces-Implementierung in Betracht ziehen könnten, ist die clientseitige API. Diese API bietet Ihnen eine voll funktionsfähige Möglichkeit zur Steuerung der Komponente, die Sie verwenden möchten. AutoComplete ist keine Ausnahme dieser Rolle, es wird auch von einer Vielzahl von Diensten unterstützt, die über Java Script aufgerufen werden können.
Bevor Sie auf die AutoComplete-Komponente zugreifen, müssen Sie definieren, was bereits zuvor definiert und benannt wurde WidgetVar. WidgetVar ist ein Primefaces-Konzept, nach dem der JavaScript-Code funktioniert.
- Lesen : PrimeFaces-Tutorials
Sie haben bereits das Aufrufen von AutoComplete-Verhaltensweisen durch die Benutzerinteraktion mit der Komponente selbst gesehen. Daher kann ein Verhalten wie „Schließen“ auftreten, wenn der Benutzer den Fokus der Komponente aufgehoben hat, während die Vorschläge angezeigt werden. Und Verhalten wie die Suche kann auftreten, sobald der Benutzer einen Text in die Komponente eingegeben hat. Alle diese Verhaltensweisen können über eine API erreicht werden, die für die Komponente selbst bereitgestellt wird, zusätzlich zu anderen Verhaltensweisen wie dem Aktivieren und Deaktivieren der Suche.
In diesem Tutorial wird erläutert, wie Sie AutoComplete mithilfe der Client Side API in PrimeFaces implementieren.
1. Clientseitige API für AutoComplete
Primefaces stellt Ihnen die folgende API zur Verfügung, die über JavaScript aufgerufen werden kann.
- schließen: Blendet das Menü mit vorgeschlagenen Elementen aus
- deaktivieren: Deaktiviert das Eingabefeld
- aktivieren: Aktiviert das Eingabefeld
- suchen: Initiiert eine Suche mit dem angegebenen Wert
- aktivieren Sie: Aktiviert das Suchverhalten
- deaktivieren: De Aktiviert das Suchverhalten
2. Die Aussicht
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> <script name="jquery/jquery.js" library="primefaces"></script> <script> function close(){ PF('autoVar').close(); } function disable(){ autoVar.disable(); } function enable(){ PF('autoVar').enable(); } function deactivate(){ autoVar.deactivate(); } function activate(){ PF('autoVar').activate(); } function search(){ PF('autoVar').search('Ol'); } </script> </h:head> <f:view afterPhase="#{autoComplete.phaseListener}"> <h:form prependId="false"> <h1>JavaBeat Primefaces Example</h1> <h2>Primefaces - AutoComplete + Client Side API</h2> <h:outputText value="Enter name of the player you wish to see statistics for :"/> #{' '} <p:autoComplete widgetVar="autoVar" id="auto" value="#{autoComplete.players}" completeMethod="#{autoComplete.complete}" var="player" itemValue="#{player}" itemLabel="#{player.playerName}" converter="#{playerConverter}" multiple="true"> <f:facet name="itemtip"> <h:panelGrid> <f:facet name="header"> <h:graphicImage value="/resources/images/#{player.playerImage}"></h:graphicImage> </f:facet> <h:outputText value="Name: "/> <h:outputText value="#{player.playerName}"/> <h:outputText value="Position: "/> <h:outputText value="#{player.playerPosition}"/> </h:panelGrid> </f:facet> <p:ajax event="itemSelect" listener="#{autoComplete.handleSelect}" update="msg"></p:ajax> <p:ajax event="itemUnselect" listener="#{autoComplete.handleUnSelect}" update="msg"></p:ajax> </p:autoComplete> <br/> <p:messages id="msg"/> <br/><br/> <br/><br/> <h:panelGrid columns="2" cellpadding="5px;" border="1"> <f:facet name="header"> <h2>Java Script Actions</h2> </f:facet> <h:commandLink value="Search About Players Starting With Ol" onclick="search();return false;" title="This action will search about players their names starting with Ol"/> <h:commandLink value="Close Suggestions" onclick="close();return false;" title="This action will close the suggestions"/> <h:commandLink value="Activate Search Behavior" onclick="activate();return false;" title="This action will activate the search by using client side api"/> <h:commandLink value="Deactivate Search Behavior" onclick="deactivate();return false;" title="This action will de activate the search by using client side api"/> <h:commandLink value="Disable AutoComplete" onclick="disable();return false;" title="This action will disable the input"/> <h:commandLink value="Enable AutoComplete" onclick="enable();return false;" title="This action will enable the input"/> </h:panelGrid> </h:form> </f:view> </html>
3. Verwaltete Bohne
AutoComplete.java
package net.javabeat.primefaces; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.faces.event.PhaseEvent; import net.javabeat.primefaces.data.Player; import net.javabeat.primefaces.util.PlayerDataSource; import org.primefaces.event.SelectEvent; import org.primefaces.event.UnselectEvent; @ManagedBean @SessionScoped public class AutoComplete { @ManagedProperty("#{playerDataSource}") private PlayerDataSource ds; private List<Player> players; public AutoComplete (){ } public List<Player> complete(String query){ // Assumed Datasource return ds.queryByName(query); } public List<Player> getPlayers() { return players; } public void setPlayers(List<Player> players) { this.players = players; } public PlayerDataSource getDs() { return ds; } public void setDs(PlayerDataSource ds) { this.ds = ds; } public void handleSelect(SelectEvent e){ Player p = (Player)e.getObject(); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Add Player :: Player Info: ID :: "+ p.getPlayerId() + " :: Name :: "+p.getPlayerName(),"")); } public void handleUnSelect(UnselectEvent e){ Player p = (Player)e.getObject(); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Remove Player :: Player Info: ID :: "+ p.getPlayerId() + " :: Name :: "+p.getPlayerName(),"")); } public void phaseListener(PhaseEvent e){ List<FacesMessage> messages = e.getFacesContext().getMessageList(); System.out.println(messages.size()); } }
4. Die Datenquelle
PlayerDataSource.java
package net.javabeat.primefaces.util; import java.util.ArrayList; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import net.javabeat.primefaces.data.Player; @ManagedBean @SessionScoped public class PlayerDataSource { public List<Player> players = new ArrayList<Player>(); public PlayerDataSource(){ // Assumed Player Player player = new Player(); player.setPlayerId("1"); player.setPlayerName("Anderias Muller"); player.setPlayerPosition("CF"); player.setPlayerAge("24"); player.setPlayerImage("am.png"); // Add Player players.add(player); // Assumed Player player = new Player(); player.setPlayerId("2"); player.setPlayerName("Olaf Thon"); player.setPlayerPosition("CM"); player.setPlayerAge("29"); player.setPlayerImage("ot.png"); // Add Player players.add(player); // Assumed Player player = new Player(); player.setPlayerId("3"); player.setPlayerName("Oliver Khan"); player.setPlayerPosition("GK"); player.setPlayerAge("31"); player.setPlayerImage("ok.png"); // Add Player players.add(player); } public List<Player> getPlayers() { return players; } public void setPlayers(List<Player> players) { this.players = players; } public List<Player> queryByName(String name){ // Assumed search using the startsWith List<Player> queried = new ArrayList<Player>(); for(Player player: this.players){ if(player.getPlayerName().startsWith(name)){ queried.add(player); } } return queried; } }
5. Der Konverter
PlayerConverter.java
package net.javabeat.primefaces.converter; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.RequestScoped; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.FacesConverter; import net.javabeat.primefaces.data.Player; import net.javabeat.primefaces.util.PlayerDataSource; //To be considered by the JavaServer Faces As Managed Bean // & Make the converter Eligible for use @ManagedProperty @ManagedBean @RequestScoped @FacesConverter public class PlayerConverter implements Converter{ @ManagedProperty(value="#{playerDataSource}") private PlayerDataSource ds; public PlayerDataSource getDs() { return ds; } public void setDs(PlayerDataSource ds) { this.ds = ds; } @Override public Object getAsObject(FacesContext context, UIComponent component,String value) { for(Player p : ds.getPlayers()){ if(p.getPlayerId().equals(value)){ return p; } } return null; } @Override public String getAsString(FacesContext context, UIComponent component,Object value) { if(value instanceof Player){ Player player = (Player)value; return player.getPlayerId(); } return ""; } }
6. Spieler Pojo
Player.java
package net.javabeat.primefaces.data; public class Player { private String playerId; private String playerName; private String playerPosition; private String playerAge; private String playerImage; public String getPlayerId() { return playerId; } public void setPlayerId(String playerId) { this.playerId = playerId; } public String getPlayerName() { return playerName; } public void setPlayerName(String playerName) { this.playerName = playerName; } public String getPlayerPosition() { return playerPosition; } public void setPlayerPosition(String playerPosition) { this.playerPosition = playerPosition; } public String getPlayerAge() { return playerAge; } public void setPlayerAge(String playerAge) { this.playerAge = playerAge; } public String getPlayerImage() { return playerImage; } public void setPlayerImage(String playerImage) { this.playerImage = playerImage; } public boolean equals(Object obj){ if(obj instanceof Player){ Player player = (Player)obj; if(this.playerId.equals(player.getPlayerId())){ return true; } } return false; } public int hashCode(){ return this.playerId.hashCode(); } }
7. PrimeFaces AutoComplete + POJO + Client-seitige API-Demo
Beachten Sie die folgenden Punkte, wenn Sie die Demo ausführen:
- Der Suchlink sollte alle Spieler durchsuchen, deren Namen mit beginnen Olda die Suchfunktion diesen Wert als Parameter bereitstellt.
- Vorschläge schließen, die Vorschläge sollten nur ausgeblendet werden, mit der Möglichkeit, sie erneut anzuzeigen.
- Wenn Sie die Suche deaktivieren, können Sie keine Suche über die clientseitige API durchführen.
- Wenn Sie die Suche aktivieren, können Sie eine Suche über die clientseitige API durchführen.
- Deaktivieren, sollte die Eingabe deaktivieren. Daher konnte der Benutzer keinen Text darin eingeben.
- Aktivieren, aktiviert die Eingabe wieder, um Benutzereingaben zu akzeptieren.
(wpdm_file id=66)