更新 <p:outputpanel> 时遇到问题

Trouble updating <p:outputpanel>

提问人:Sergio 提问时间:7/6/2022 更新时间:7/23/2022 访问量:168

问:

好的,我的问题是我无法从 ajax 更新组件 (cursos),我真的不知道为什么。

这是我的代码:

罗尔
                                    <h:selectManyCheckbox value="#{usuarioSession.roles}" id="admin" disabled="#{checkView.validarAdm}">
                                        <f:selectItem itemValue="1" itemLabel="Administrador"></f:selectItem>                       
                                        <p:ajax listener="#{checkView.checkBoxAdmin()}" update="est"></p:ajax>
                                    </h:selectManyCheckbox>

                                    <h:selectManyCheckbox value="#{usuarioSession.roles}" id="doce" disabled="#{checkView.validarDoc}">
                                        <f:selectItem itemValue="2" itemLabel="Docente"></f:selectItem>                          
                                        <p:ajax listener="#{checkView.checkBoxDoc()}" update="est, cursos"></p:ajax>
                                    </h:selectManyCheckbox>

                                    <h:selectManyCheckbox value="#{usuarioSession.roles}" id="est" disabled="#{checkView.validarEst}">
                                        <f:selectItem itemValue="3" itemLabel="Estudiante"></f:selectItem>
                                        <p:ajax listener="#{checkView.checkBoxEst()}" update="doce, admin"></p:ajax>
                                    </h:selectManyCheckbox>

                                </div>
                                
                                <p:outputPanel rendered="#{checkView.check2 == true}" id="cursos" >
                                    <div class="mb-3">
                                        <h:outputLabel class="form-label">Curso</h:outputLabel>
                                        <h:selectManyCheckbox value="#{usuarioSession.cursos}">
                                            <c:forEach items="#{crearCursoView.listarCurso()}" var="lc">
                                                <f:selectItem itemValue="#{lc}" itemLabel="#{lc.nombre}"></f:selectItem>
                                            </c:forEach>
                                        </h:selectManyCheckbox>
                                    </div>
                                </p:outputPanel>
JSF Primefaces XHTML

评论

0赞 Jasper de Vries 7/6/2022
这回答了你的问题吗?Ajax 更新/渲染在具有 render 属性的组件上不起作用

答:

2赞 Melloware 7/6/2022 #1

你有一个非常常见的问题,因为如果你的输出面板没有被渲染,它就不在JSF树中,所以你无法更新它。秘诀是始终使用没有标志的包装器组件,因此您始终可以更新该包装器元素来显示和隐藏。使用以下示例并更新而不是rendered="#{checkView.check2 == true}"renderedp:outputPanelcursosWrappercursos

<p:outputPanel id="cursosWrapper">
    <p:outputPanel rendered="#{checkView.check2 == true}" id="cursos" >
        <div class="mb-3">
            <h:outputLabel class="form-label">Curso</h:outputLabel>
            <h:selectManyCheckbox value="#{usuarioSession.cursos}">
                <c:forEach items="#{crearCursoView.listarCurso()}" var="lc">
                    <f:selectItem itemValue="#{lc}" itemLabel="#{lc.nombre}"></f:selectItem>
                </c:forEach>
            </h:selectManyCheckbox>
        </div>
    </p:outputPanel>
</p:outputPanel>

...或使用 JSF 直通将标志添加到内部 DIV。jsf:rendered

<p:outputPanel id="cursosWrapper">
    <div class="mb-3" jsf:rendered="#{checkView.check2 == true}">
        <h:outputLabel class="form-label">Curso</h:outputLabel>
        <h:selectManyCheckbox value="#{usuarioSession.cursos}">
            <c:forEach items="#{crearCursoView.listarCurso()}" var="lc">
                <f:selectItem itemValue="#{lc}" itemLabel="#{lc.nombre}"></f:selectItem>
            </c:forEach>
        </h:selectManyCheckbox>
    </div>
</p:outputPanel>