2010-02-24 6 views
6

Ich habe diesen Testfall erstellt, der mein Problem isoliert. Die Aktion a4j: commandLink wird nicht ausgeführt, nachdem die Abfrage eine Ajax-Aktualisierung durchgeführt hat. Es wird ausgeführt, wenn wir das modalPanel vor dem ReRender der Umfrage schließen.a4j: CommandLink funktioniert nicht mehr nach dem ReRender

Irgendwelche Vorschläge? Danke im Voraus.

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 ist Sitzung scoped. Richfaces Version 3.3.2.SR1

Und auch in Chrome 5.0.322.2 Dev wird das ModalPanel nicht angezeigt. Es funktioniert unter FF und IE7.

Antwort

4

Versuchen eine beliebige Kombination aus den folgenden:

  • bewegen den <a4j:form> außerhalb des modalen Platte
  • die domElementAttachment Satz (der modalen Panel) Attribut entweder form oder parent
  • versuchen, mit <h:form>

Versuchen Sie Folgendes anstelle von <a4j:commandLink>:

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

und verwenden onhide="notifyClose()" auf der modalPanel, wobei notifyClose() definiert ist <a4j:jsFunction> verwenden. Dies ist ein kleiner Ausweg, könnte aber funktionieren.

+0

Ich habe diesen Testfall aus einer Komponente in meiner Anwendung, die dieses Problem hat. Die Komponente hat domElementAttachment auf "parent", aber die Verknüpfung funktioniert nicht. Ich werde versuchen, das Formular zu verschieben ... – pakore

+0

Das Verschieben des Formulars außerhalb des ModalPanel hilft auch nicht. Danke trotzdem für die Antwort. – pakore

+0

@pakore - Ich meinte - verschiebe das Formular nach draußen und entferne die zweite Form. Hast du das versucht? – Bozho

4

Dies ist die Arbeitslösung. Ich habe die Antwort von Bozho als gültig akzeptiert, weil er den Workaround vorgeschlagen hat, der hier implementiert wird, aber ich poste hier die komplette Lösung, falls jemand das gleiche Problem hat.

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> 

Es ist wichtig, die a4j:jsFunction außerhalb des modalPanel Tag zu halten.

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; 
    } 
} 
Verwandte Themen