a4j:commandLink прекращает работать будучи перерендерингом

Я создал этот тестовый сценарий, который изолирует мою проблему. a4j:commandLink действие не выполняется, после того как опрос делает обновление ajax. Это выполняется, если мы закрываем modalPanel перед перерендерингом опроса.

Какое-либо предложение?Заранее спасибо.

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>

Ссылка

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 является ограниченной по объему сессией. Версия 3.3.2. SR1 Richfaces

И также в Chrome 5.0.322.2 dev modalPanel не появляется. Это делает под FF и IE7.

6
задан pakore 24 February 2010 в 14:04
поделиться

2 ответа

Попробуйте любую комбинацию из следующего:

  • переместите за пределы модальной панели
  • установите для атрибута domElementAttachment (модальной панели) значение либо form , либо parent
  • попробуйте использовать

Попробуйте следующее вместо :

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

и используйте onhide = "notifyClose ()" на modalPanel , где notifyClose () определяется с помощью . Это своего рода обходной путь, но он может сработать.

4
ответ дан 16 December 2019 в 21:38
поделиться

Это рабочее решение. Я принял ответ Божо как действительный, потому что он предложил обходной путь, который здесь реализован, но я просто публикую здесь полное решение на случай, если у кого-то возникнет такая же проблема.

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>

Важно сохранить a4j: jsFunction вне тега 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;
    }
}
4
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: