webentwicklung-frage-antwort-db.com.de

Übergeben Sie den Parameter von JavaScript an p: remoteCommand

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?

39
Rajat Gupta
remoteCommandFunctionName({name1:'value1', name2:'value2'});
19
Cagatay Civici

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

Aktualisieren

Der Zugriff auf die Parameter in modernem CDI JSF kann auf andere Weise erfolgen, umreißen Sie dies in diese Stapelüberlauf-F/A

79
BalusC

Seite:

<p:remoteCommand name="command" action="#{bean.method}" />

JavaScript:

command({param: 'value'});

Bohne:

public void method() {
    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}
55
Joel Richard

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;
    }
}
7
Jonathan L

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}" />
3
jorelia

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 &lt; columnsCount; i++) {
                    json[i] = { name: i, value: document.getElementById('table').rows[0].cells[i].offsetWidth};

                }

                console.log(json);
                remoteCommand(json);
            };
    </script>
0
Vasil Valchev