【问题标题】:Empty variable when open <p:dialog> - JFS 2.0, Primefaces打开 <p:dialog> 时为空变量 - JFS 2.0,Primefaces
【发布时间】:2025-12-26 19:05:06
【问题描述】:

你好吗?

现在可能是一个新手问题。现在我在表单中有一个输入和一个“提交”按钮。当我点击提交时,这不会调用任何方法,只会打开一个&lt;p:dialog&gt;。打开此对话框时,未设置输入中的变量,因此我输入的另一个输入不显示任何内容。

查看图片即可了解:

点击“提交”后(Adicionar): 第二张图片必须显示与第一个输入完全相同的值,但正如您所见,这只是显示一个空输入。


现在让我们看看我的代码。

这是我的 JSF:

<h:form id="inserirDisciplina">

    <h:inputText styleClass="form-control" id="disciplina" value="#{cursoMBean.nome}"
      valueChangeListener="#{cursoMBean.atualizarListagemPesquisa}">
      // atualizarListagemPesquisa just update the arraylist to be shown in dataTable

        <f:ajax event="keyup" render=":meuForm:minhaTabela" />
    </h:inputText>

    <h:commandButton value="Adicionar" styleClass="btn btn-md btn-success">
        <p:ajax event="click" update=":meuForm:display" render=":meuForm:dialog" oncomplete="PF('insert').show();" onerror="alert('erro');" />
    </h:commandButton>

    <p:dialog id="dialog" header="Inserir Curso" widgetVar="insert" resizable="false" modal="true" width="600" height="500" hideEffect="clip" closeOnEscape="true" focus="enviar">
            <h:panelGrid id="display" styleClass="col-lg-10 center">
                 <label for="nome">Nome:</label>
                 <p:inputText styleClass="form-control adicionar" id="nome" value="#{cursoMBean.nome}" />
             </h:panelGrid>

                ...

MBean:

private String nome;

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

编辑(新视图):

<h:form id="inserirDisciplina">
    <div class="form-group">
        <div class="col-md-10">
            <h:inputText styleClass="form-control" id="disciplina" value="#{cursoMBean.nome}" valueChangeListener="#{cursoMBean.atualizarListagemPesquisa}">
                <f:ajax event="keyup" render=":meuForm:minhaTabela" />
            </h:inputText>
        </div>
        <div class="col-md-2">
            <h:commandButton value="Adicionar" styleClass="btn btn-md btn-success" process="disciplina" partialSubmit="true">
                <p:ajax event="click" update=":meuForm:display" render=":meuForm:dialog" partialSubmit="true" process="disciplina" oncomplete="PF('insert').show();" onerror="alert('erro');" />
            </h:commandButton>
        </div>
    </div>
</h:form>

<p:messages autoUpdate="true" />

<p:dialog id="dialog" header="Inserir Curso" widgetVar="insert"
                resizable="false" modal="true" width="600" height="500"
                hideEffect="clip" closeOnEscape="true">

<h:form>
    <h:panelGrid id="display" styleClass="col-lg-10 center" style="margin-top: 10px; margin-bottom: 15px;">
        <label for="nome">Nome:</label>
        <p:inputText styleClass="form-control adicionar" id="nome" value="#{cursoMBean.nome}">

        </p:inputText>
    </h:panelGrid>

    <h:panelGrid styleClass="col-lg-10 center">
        <p:columnGroup>
            <label for="disciplinas">Disciplinas do Curso:</label>
            <h:selectManyCheckbox style="margin-bottom: 40px;" id="disciplinas" value="#{cursoMBean.listaDisciplinasDoCurso}" converter="omnifaces.SelectItemsConverter">
                <f:selectItems value="#{cursoMBean.listaTodasDisciplinas}" var="disciplina" itemValue="#{disciplina}" itemLabel="#{disciplina.nome}" />
            </h:selectManyCheckbox>
        </p:columnGroup>
    </h:panelGrid>

    <h:panelGrid styleClass="col-lg-10 center">
        <p:columnGroup>
            <h:commandButton id="enviar" styleClass="btn btn-lg btn-success pull-right" value="Adicionar" action="#{cursoMBean.cadastrar}">
                    <f:ajax event="click" execute="@form" onevent="insert.hide()" render=":meuForm:minhaTabela" listener="#{cursoMBean.cadastrar}" />
            </h:commandButton>
        </p:columnGroup>
    </h:panelGrid>
</h:form>
</p:dialog>

我做错了什么?

【问题讨论】:

  • 你的托管 bean 的范围是什么?
  • 范围是@Session

标签: jsf jsf-2 primefaces


【解决方案1】:

试试下面的按钮代码:

<p:commandButton value="Adicionar" styleClass="btn btn-md btn-success"
   process="disciplina" partialSubmit="true" update=":inserirDisciplina:display"
   oncomplete="insert.show();" onerror="alert('erro');">
</p:commandButton>

【讨论】:

  • 你得到的结果和以前一样吗?
  • 是的,什么也没有出现。奇怪的是:当我提交 (将输入字段留空)时,Disciplina 以正确的名称注册。所以,问题是 p:dialog 不显示名称,但是当我提交对话框时,提交了正确的名称。
  • 你的表单ID是inserirDisciplina,那你为什么到处使用meuForm呢?更改并重试。
  • meuForm 是显示Disciplina 结果的数据表。当我在输入中(对话框外)输入内容时,我的 dataTable :meuForm:minhaTabela 将更新为新匹配的 Disciplinas。这有点像实时搜索。
  • 但对话框不在该表单内。还是有嵌套表单?