web-dev-qa-db-ja.com

h:inputTextのf:ajaxにパラメーターを渡す方法は? f:paramが機能しない

Ajaxリクエストでサーバーにパラメーターを渡す必要があります。以下のコードをご覧ください。スコープ:スコープを表示

f:paramなし

<p:column width="40">
    <h:inputText id="originalCostInputTxt" value="#{articlePromo.costoBruto}" 
        <f:ajax event="change"
            execute="@this" 
            listener="#{promotionDetailManagedBean.onCostoBrutoChange}">
        </f:ajax>
    </h:inputText>
</p:column>

マネージドBean

public final void onCostoBrutoChange(final AjaxBehaviorEvent event) {
    createCostoBrutoOptions(promoArticlesList);
}

この場合、メソッドonCostoBrutoChange()が呼び出されます。ただし、f:paramを含めると呼び出されません。以下のコードをご覧ください。

f:paramを使用

<p:column width="40">
    <h:inputText id="originalCostInputTxt" value="#{articlePromo.costoBruto}" 
        <f:ajax event="change"
            execute="@this" 
            listener="#{promotionDetailManagedBean.onCostoBrutoChange}">
         <f:param value="#{articlePromo.promocionArticuloId}" name="myId"/> 
        </f:ajax>
    </h:inputText>
</p:column>

マネージドBean

public final void onCostoBrutoChange(final AjaxBehaviorEvent event) {
    createCostoBrutoOptions(promoArticlesList);
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("myId");
}

このコードの誤りを特定できません。ご案内ください。

ありがとう、シカ

13
Shikha Dhawan

<f:param>はリンクとボタンでのみ機能し、入力では機能しません。

ご使用の環境がEL2.2をサポートしている場合は、代わりにメソッド引数として渡します。

<h:inputText ...>
    <f:ajax listener="#{bean.listener(item.id)}" />
</h:inputText>
public void listener(Long id) {
    // ...
}

アイテム全体を渡すこともできます。

<h:inputText ...>
    <f:ajax listener="#{bean.listener(item)}" />
</h:inputText>
public void listener(Item item) {
    // ...
}

ご使用の環境がEL2.2をサポートしていない、またはサポートできない場合は、代わりにプログラムでELを評価してください。

public void listener() {
    FacesContext context = FacesContext.getCurrentInstance();
    Long id = context.getApplication().evaluateExpressionGet(context, "#{item.id}", Long.class);
    // ...
}
37
BalusC