2012-03-15 18 views
5

Aquí está mi casilla de verificación. Estoy preparando una cadena delimitada por comas de identificadores de componentes en el oyente. El problema aquí es el getter getUpdateComponentList() que se llama antes de llamar al oyente. Entonces la cadena nunca se actualiza.p: ajax getter para que la actualización se llame antes del oyente

<p:outputPanel> 
<h:selectManyCheckbox value="#{form.colors}"> 
    <f:selectItems value="#{form.colorItems}"/> 
    <p:ajax listener="#{form.testListener}" event="change" update="#{form.updateComponentList}" /> 
</h:selectManyCheckbox> 
</p:outputPanel> 

Respuesta

9

El comportamiento esperado. PrimeFaces (y JSF estándar) no vuelve a evaluar los atributos update (y render, oncomplete, etc.) por solicitud. Se evalúan según la vista. RichFaces, por ejemplo, lo hace en su <a4j:ajax> y produce exactamente el comportamiento esperado.

Para PrimeFaces, lo mejor es quitar el atributo update y utilizar RequestContext#addPartialUpdateTarget() o #addPartialUpdateTargets() en el método de acción en su lugar.

E.g.

RequestContext.getCurrentInstance().addPartialUpdateTargets(updateComponentList); 

Se necesita un Collection<String> como List<String> o Set<String>. Por favor, event="change" es innecesario. Solo use el evento predeterminado del componente.


actualización para los usuarios de una versión más reciente PrimeFaces que están leyendo esta respuesta más tarde y no pueden encontrar los métodos antes mencionados, que de hecho se quitará en una versión más reciente PrimeFaces; utilice uno de los dos métodos update() en su lugar (uno toma un String y otro toma un Collection<String>).

RequestContext.getCurrentInstance().update(updateComponentList); 
+0

@Balusc, ¿Me puede dar un exemple por favor? ! –

+0

porque no puedo encontrar el método addPartialUpdateTargets –

+1

@berber: Ha quedado obsoleto en PrimeFaces 3.2 y eliminado en PrimeFaces 3.4. En su lugar, necesitas el método 'update()'. – BalusC

2

Me enfrenté a un problema similar sobre la 'actualización' que se ejecuta antes del 'oyente'. Poner dos 'p: ajax' -uno con el oyente y otro con la actualización- funcionó.

En su caso:

<p:outputPanel> 
    <h:selectManyCheckbox value="#{form.colors}"> 
    <f:selectItems value="#{form.colorItems}"/> 
    <p:ajax event="change" listener="#{form.testListener}" /> 
    <p:ajax event="change" update="#{form.updateComponentList}" /> 
    </h:selectManyCheckbox> 
</p:outputPanel> 
Cuestiones relacionadas