2012-05-01 29 views
9

Necesito pasar un parámetro al servidor en mi solicitud de ajax. Por favor mira el código a continuación. Alcance: Ver ámbitoCómo pasar el parámetro a f: ajax en h: inputText? f: param no funciona

Sin 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 administrado

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

En este caso, el método onCostoBrutoChange() no se invoca. Pero no se invoca cuando incluyo f: param. Por favor mira el código a continuación.

con 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 administrado

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

No es capaz de identificar cuál es incorrecto en este código. Por favor guía.

Gracias, Shikha

Respuesta

27

Los <f:param> obras en enlaces y botones solamente, no en los insumos.

Si su entorno acepta EL 2.2, sólo tiene que pasar como argumento de un método en su lugar:

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

public void listener(Long id) { 
    // ... 
} 

también puede simplemente pasar todo el material:

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

public void listener(Item item) { 
    // ... 
} 

Si su entorno no admite o no es compatible con EL 2.2, entonces evalúe EL programáticamente en su lugar.

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

No estaba al tanto de esta manera ... ¡¡¡Genial !!! – Daniel

+3

Respuesta del Dios mismo ... :) Gracias. Funcionó. No estaba enterado de lo mismo. –

+0

@BalusC Estoy evaluando EL programmatically dentro de 'c: foreach', usando la variable de iteración' var', pero se evalúa como 'null'. – Theo