remoteCommand
javascriptから値を渡したいです。これが可能な場合、どうすればそれを行うことができ、どのようにバッキング Bean でそれらを受け取ることができますか?
7 に答える
はい、可能です。その方法は、PrimeFaces のバージョンによって異なります。PrimeFaces ユーザー ガイドで確認できます。
PrimeFaces 3.3 以降
PrimeFaces バージョン 3.3 以降の構文は次のとおりです (3.3 ユーザー ガイドからコピーペースト)。
3.81 リモートコマンド
...
パラメータを渡す
リモート コマンドは、次の方法で動的パラメータを送信できます。
increment([{name:'x', value:10}, {name:'y', value:20}]);
この方法では、1 つのパラメーター名に複数の値を指定できます。上記のような単一の値を持つパラメーターは、古い方法と同じ方法で利用できます。
@ManagedProperty("#{param.x}")
private int x;
@ManagedProperty("#{param.y}")
private int y;
(注: Mojarra では使用できますがInteger
、MyFaces では使用できません。これは とはまったく関係ありません<p:remoteCommand>
)
または、より広い範囲の Bean のメソッドで:
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
複数の値を持つパラメーターを指定する必要がある場合は、次のように実行できます。
functionName([{name:'foo', value:'one'}, {name:'foo', value:'two'}, {name:'foo', value:'three'}]);`
リクエストスコープのBeanで:
@ManagedProperty("#{paramValues.foo}")
private String[] foos;
または、より広い範囲の Bean のメソッドで:
Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
PrimeFaces 3.2 以前
PrimeFaces バージョン 3.3より前の構文は次のとおりです (3.2 ユーザー ガイドからコピーペースト)。
3.80 リモートコマンド
...
パラメータを渡す
リモート コマンドは、次の方法で動的パラメータを送信できます。
increment({param1:'val1', param2:'val2'});
通常の方法でバッキング Bean で使用できます。たとえば、リクエスト スコープの Bean では次のようになります。
@ManagedProperty("#{param.param1}")
private String param1;
@ManagedProperty("#{param.param2}")
private String param2;
または、より広い範囲の Bean のメソッドで:
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
ただし、このアプローチには、通常の HTML フォームや HTTP リクエスト パラメータのように複数の値を持つ 1 つのパラメータを指定できないという欠点がありました (実際には複数選択ドロップダウン リストや複数選択チェックボックス グループなどで使用されます)。
以下も参照してください。
ページ:
<p:remoteCommand name="command" action="#{bean.method}" />
JavaScript:
command({param: 'value'});
豆:
public void method() {
String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}
remoteCommandFunctionName({name1:'value1', name2:'value2'});
機能的な例として @BalusC @Joel の投稿を組み合わせる
<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;
}
}
独自の関数を呼び出したい場合。カスタム関数は、渡すパラメータ スタイルに準拠している必要があります。例えば:
<p:commandLink id="myId" onclick="confirmDelete([{name:'Id', value: '#{my.id}'}]);" immediate="true">
Java スクリプト関数
function confirmDelete(id) {
if (confirm('Do you really want to delete?')) {
remoteDeleteDemand(id);
return true;
}
remoteCommand タグ
<p:remoteCommand name="remoteDeleteDemand" actionListener="#{myController.doDelete}" />