Ich möchte Wert von Javascript an remoteCommand
übergeben. Wenn dies möglich ist, wie kann ich das tun und wie kann ich sie in der Bohnen erhalten?
remoteCommandFunctionName({name1:'value1', name2:'value2'});
Ja, es ist möglich. Wie das geht, hängt von der PrimeFaces-Version ab. Sie können es in PrimeFaces-Benutzerhandbuch sehen. Vor PrimeFaces Version 3.3 lautete die Syntax wie folgt (kopiert aus dem 3.2-Benutzerhandbuch):
3.80 RemoteCommand
...
Parameter übergeben
Remote-Befehl kann dynamische Parameter auf folgende Weise senden;
increment({param1:'val1', param2:'val2'});
Es ist in der Backbohne auf übliche Weise erhältlich. Z.B. In einem Request Scoped Bean:
@ManagedProperty("#{param.param1}")
private String param1;
@ManagedProperty("#{param.param2}")
private String param2;
oder bei der Methode einer Bohne mit breiterem Anwendungsbereich:
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
Dieser Ansatz hatte jedoch den Nachteil, dass Sie keinen einzelnen Parameter mit mehreren Werten angeben können, wie dies bei normalen HTML-Formularen und HTTP-Anforderungsparametern möglich ist (was in der Praxis beispielsweise für Dropdown-Listen mit mehreren Auswahlen und Kontrollkästchengruppen mit mehreren Auswahlen verwendet wird).
Seit PrimeFaces Version 3.3 lautet die Syntax wie folgt (kopiert aus dem 3.3-Benutzerhandbuch):
3.81 RemoteCommand
...
Parameter übergeben
Remote-Befehl kann dynamische Parameter auf folgende Weise senden;
increment([{name:'x', value:10}, {name:'y', value:20}]);
Auf diese Weise können mehrere Werte für einen einzelnen Parameternamen angegeben werden. Parameter mit einzelnen Werten wie oben sind auf die gleiche Weise wie auf die alte Weise verfügbar:
@ManagedProperty("#{param.x}")
private int x;
@ManagedProperty("#{param.y}")
private int y;
(Anmerkung: Sie können Integer
in Mojarra verwenden, aber nicht in MyFaces. Dies hat außerdem nichts mit <p:remoteCommand>
zu tun.)
oder bei der Methode einer Bohne mit breiterem Anwendungsbereich:
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
Wenn Sie einen Parameter mit mehreren Werten angeben müssen, können Sie dies folgendermaßen tun:
functionName([{name:'foo', value:'one'}, {name:'foo', value:'two'}, {name:'foo', value:'three'}]);`
mit in einem Antrag scoped Bohne:
@ManagedProperty("#{paramValues.foo}")
private String[] foos;
oder bei der Methode einer Bohne mit breiterem Anwendungsbereich:
Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
Der Zugriff auf die Parameter in modernem CDI JSF kann auf andere Weise erfolgen, umreißen Sie dies in diese Stapelüberlauf-F/A
Seite:
<p:remoteCommand name="command" action="#{bean.method}" />
JavaScript:
command({param: 'value'});
Bohne:
public void method() {
String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}
Kombinieren Sie @BalusC @ Joels Beitrag für ein Funktionsbeispiel
<h:form>
<p:remoteCommand name="rcName" update="msgs" actionListener="#{remoteCommandView.beanMethod}" />
<p:growl id="msgs" showDetail="true" />
<p:commandButton type="button" onclick="rcName([{name:'model', value:'Buick Encore'}, {name:'year', value:2015}]);" value="Pass Parameters 1" /><br/>
<p:commandButton type="button" onclick="clicked();" value="Pass Parameters 2" />
</h:form>
<script type="text/javascript">
//<![CDATA[
function clicked(){
rcName([{name:'model', value: 'Chevy Volt'}, {name:'year', value:2016}]);
}
//]]>
</script>
@ManagedBean
public class RemoteCommandView {
public void beanMethod() {
// OR - retrieve values inside beanMethod
String model1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("model");
String year1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("year");
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Executed",
"Using RemoteCommand with parameters model := " + model + ", year := " + year));
}
@ManagedProperty("#{param.model}")
private String model;
@ManagedProperty("#{param.year}")
private int year;
public void setModel(String model) {
this.model = model; // value set by JSF
}
public void setYear(int year) {
this.year = year;
}
}
Wenn Sie mehr als einen Parameter von Javascript übergeben müssen, lautet die Syntax:
var param1 = ...;
var param2 = ...;
var param3 = ...;
remoteCommandFunction([{name:'param1', value:param1}, {name:'param2',value:param2}, {name:'param3',value:param3}]);
Wenn Sie eine eigene Funktion aufrufen möchten, z. In einem Bestätigungsdialogfeld muss Ihre benutzerdefinierte Funktion mit dem übergebenden Parameterstil . kompatibel sein. Beispiel:
<p:commandLink id="myId" onclick="confirmDelete([{name:'Id', value: '#{my.id}'}]);" immediate="true">
Die Java-Skriptfunktion
function confirmDelete(id) {
if (confirm('Do you really want to delete?')) {
remoteDeleteDemand(id);
return true;
}
Das remoteCommand-Tag
<p:remoteCommand name="remoteDeleteDemand" actionListener="#{myController.doDelete}" />
PrimeFace 5.0, dynamisches Array (alle Tabellenspalten werden mit dieser Methode gesendet)
Strahl
public void updateTableColumnsWidth() {
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> map = context.getExternalContext().getRequestParameterMap();
}
p: remoteCommand
<h:form>
<p:remoteCommand name="remoteCommand" action="#{controller.updateTableColumnsWidth}" />
</h:form>
JS
<script type="text/javascript">
function updateTableColumnsWidth () {
var columnsCount = document.getElementById('table').rows[0].cells.length;
var json = [];
for (var i = 0; i < columnsCount; i++) {
json[i] = { name: i, value: document.getElementById('table').rows[0].cells[i].offsetWidth};
}
console.log(json);
remoteCommand(json);
};
</script>