2010-02-24 13 views
6

Ho creato questo test case che isola il mio problema. L'azione a4j: commandLink non viene eseguita quando il sondaggio esegue un aggiornamento ajax. Viene eseguito se chiudiamo il modalPanel prima del reRender del sondaggio.a4j: commandLink smette di funzionare dopo essere stato restituito

Qualche suggerimento? Grazie in anticipo.

test.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:c="http://java.sun.com/jsp/jstl/core" 
xmlns:fnc="http://eyeprevent.com/fnc"> 
<a4j:outputPanel id="testing"> 
<rich:modalPanel id="examinationPanel" autosized="true" width="450" rendered="#{test.condition2}"> 
    <f:facet name="header"> 
     <h:outputText value="View Examination Images" /> 
    </f:facet> 
    <f:facet name="controls"> 
     <h:panelGroup> 

      <a4j:form> 

       <a4j:commandLink action="#{test.close}"> 
        <h:graphicImage value="/images/modal/close.png" id="hideExaminationPanel" styleClass="hidelink" /> 
       </a4j:commandLink> 
      </a4j:form> 
      <rich:componentControl for="examinationPanel" attachTo="hideExaminationPanel" operation="hide" event="onclick" /> 

     </h:panelGroup> 
    </f:facet> 


    <a4j:form> 

     <h:panelGrid columns="1" id="timeoutText"> 
      <h:outputText id="remainingtime" value="condition1" rendered="#{test.condition1}" /> 
      <h:outputText id="timer" value="condition2" rendered="#{test.condition2}" /> 

     </h:panelGrid> 

     <a4j:poll id="poll" interval="5000" enabled="#{test.poll}" reRender="poll,timeoutText" /> 



    </a4j:form> 
</rich:modalPanel> 

link

TestBean.java

import org.apache.log4j.Logger; 
public class TestBean { 
private boolean condition1=false; 
private boolean condition2=true; 
private boolean poll=true; 

public void close(){ 
Logger.getLogger("com.eyeprevent").info("here!"); 
poll=false; 
condition1=true; 
condition2=false; 

} 

public boolean isCondition1() { 
return condition1; 
} 

public void setCondition1(boolean condition1) { 
this.condition1 = condition1; 
} 

public boolean isCondition2() { 
return condition2; 
} 
public void setCondition2(boolean condition2) { 
this.condition2 = condition2; 
} 
public boolean isPoll() { 
return poll; 
} 
public void setPoll(boolean poll) { 
this.poll = poll; 
} 
} 

TestBean è con scope di sessione. Richfaces versione 3.3.2.SR1

E anche in Chrome 5.0.322.2 dev il modalPanel non viene visualizzato. Fa sotto FF e IE7.

risposta

4

Prova una qualsiasi combinazione dei seguenti:

  • mossa <a4j:form> all'esterno del quadro modale
  • impostare il domElementAttachment (del pannello modale) attribuire a uno form o parent
  • provare a utilizzare <h:form>

Provare quanto segue anziché <a4j:commandLink>:

<h:graphicImage value="/images/modal/close.png" styleClass="hidelink" 
      onclick="#{rich:component('examinationPanel')}.hide()" id="close" /> 

e utilizzare onhide="notifyClose()" sul modalPanel, dove notifyClose() è definita usando <a4j:jsFunction>. Questo è un po 'una soluzione, ma potrebbe funzionare.

+0

ho avuto questo tipo di test da un componente nella mia richiesta, che ha questo problema. Il componente ha domElementAttachment su "parent", ma il collegamento non funziona. Ho intenzione di provare a spostare il modulo ... – pakore

+0

Spostare il modulo all'esterno del modalPanel non aiuta neanche. Grazie comunque per la risposta. – pakore

+0

@pakore - Intendevo - sposta il modulo all'esterno e sbarazzati del secondo modulo. Ci hai provato? – Bozho

4

Questa è la soluzione di lavoro. Ho accettato la risposta di Bozho come valida perché ha proposto la soluzione alternativa qui implementata, ma ho appena pubblicato la soluzione completa nel caso qualcuno avesse lo stesso problema.

test.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:c="http://java.sun.com/jsp/jstl/core" 
xmlns:fnc="http://eyeprevent.com/fnc"> 
<a4j:outputPanel id="testing"> 
<rich:modalPanel id="examinationPanel" autosized="true" width="450" rendered="#{test.condition2}" onhide="stopTimer('false')"> 
    <f:facet name="header"> 
     <h:outputText value="View Examination Images" /> 
    </f:facet> 
    <f:facet name="controls"> 
     <h:panelGroup> 
      <a4j:form> 
       <a4j:commandLink action="#{test.close}"> 
        <h:graphicImage value="/images/modal/close.png" id="hideExaminationPanel" styleClass="hidelink" /> 
       </a4j:commandLink> 
      </a4j:form> 
      <rich:componentControl for="examinationPanel" attachTo="hideExaminationPanel" operation="hide" event="onclick" /> 
     </h:panelGroup> 
    </f:facet> 
    <a4j:form> 
     <h:panelGrid columns="1" id="timeoutText"> 
      <h:outputText id="remainingtime" value="condition1" rendered="#{test.condition1}" /> 
      <h:outputText id="timer" value="condition2" rendered="#{test.condition2}" /> 
     </h:panelGrid> 
     <a4j:poll id="poll" interval="5000" enabled="#{test.poll}" reRender="poll,timeoutText" /> 
    </a4j:form> 
</rich:modalPanel> 
</a4j:outputPanel> 
<h:form> 
<a4j:commandLink oncomplete="#{rich:component('examinationPanel')}.show()" reRender="testing">Link</a4j:commandLink> 
<a4j:jsFunction name="stopTimer" actionListener="#{test.close}"> 
    <a4j:actionparam name="param1" assignTo="#{test.poll}" /> 
</a4j:jsFunction> 
</h:form> 
</html> 

E 'importante mantenere la a4j:jsFunction al di fuori del tag modalPanel.

TestBean.java:

import javax.faces.event.ActionEvent; 
import org.apache.log4j.Logger; 

public class TestBean { 
    private boolean condition1 = false; 
    private boolean condition2 = true; 
    private boolean poll = true; 

    public void close(ActionEvent event) { 
     Logger.getLogger("com.eyeprevent").info("here!"); 
     poll = false; 
     condition1 = true; 
     condition2 = false; 
    } 

    public boolean isCondition1() { 
     return condition1; 
    } 

    public void setCondition1(boolean condition1) { 
     this.condition1 = condition1; 
    } 

    public boolean isCondition2() { 
     return condition2; 
    } 

    public void setCondition2(boolean condition2) { 
     this.condition2 = condition2; 
    } 

    public boolean isPoll() { 
     return poll; 
    } 

    public void setPoll(boolean poll) { 
     this.poll = poll; 
    } 
} 
Problemi correlati