如果在验证失败后使用PrimeFaces对话框,则自动填充建议为空

时间:2013-10-22 03:34:07

标签: validation primefaces autocomplete dialog

PrimeFaces 3.5。 雄猫7 JSF 2.0。

请考虑以下示例。

  <p:commandButton value="Open Dialog" oncomplete="myDialogWidget.show()"/>

  <p:dialog id="myDialog" widgetVar="myDialogWidget" modal="true" header="#{someDataAutoCompleteBean.selectedOption}">
    <h:form>
      <p:outputLabel for="someData" value="Some Data:" />
      <p:autoComplete id="someData" value="#{someDataAutoCompleteBean.selectedOption}"
        completeMethod="#{someDataAutoCompleteBean.determineOptions}" forceSelection="true" required="true"
        requiredMessage="Data can not be blank." queryDelay="0"/>
      <p:commandButton update=":myDialog" value="Save and Stay" oncomplete="myDialogWidget.show()"/>
      <p:commandButton value="Save and Close" oncomplete="handleDialogSubmit(myDialogWidget, args)"/>
    </h:form>
  </p:dialog>

这是豆子:

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;

@ManagedBean
public class SomeDataAutoCompleteBean
{
  private String selectedOption;

  public List<String> determineOptions(String query)
  {
    List<String> results = new ArrayList<String>();

    for (int i = 0; i < 10; i++)
    {
      results.add(query + i);
    }

    return results;
  }

  public String getSelectedOption()
  {
    return selectedOption;
  }

  public void setSelectedOption(final String selectedOption)
  {
    this.selectedOption = selectedOption;
  }
}

并且有一个相关的javascript函数:

  function handleDialogSubmit(dialog, args)
  {
    if (args.validationFailed)
    {
      dialog.show();
    }
    else
    {
      dialog.hide();
    }
  }

如果单击“保存并保留”按钮,则会正确获得一条验证消息,指示缺少值。如果您尝试通过键入选择自动完成框中的建议,您将收到NullPointerException。

这是因为没有调用对话框的“completeMethod”,导致建议列表为null。高兴的表面继续,好像有什么东西在那里。

如果自动完成组件不在对话框中,则此问题不存在。 设置appendToBody =“true”无法修复它。

就像对话框需要某种部分重置一样;还不够,以便验证失败的组件仍然保持红色,但足够重置,以便调用completeMethod。我甚至试图通过在自动完成组件的“onstart”方法上对表单发出重置来解决此问题。

请注意,您可以通过不更新对话框来避免错误,而是在按下“保存并继续”按钮时更改表单。但是,这会导致标头无法刷新并显示不正确的值。

我认为这是Primefaces中的一个错误。任何人都可以确认或提供解决方案/解决方法吗?

1 个答案:

答案 0 :(得分:0)

似乎问题与更新表单有关,而不是对话框。可以通过在对话框外移动表单来解决此问题。即:

  <h:form>
    <p:dialog id="myDialog" widgetVar="myDialogWidget" modal="true" header="#{someDataAutoCompleteBean.selectedOption}">
      <p:outputLabel for="someData" value="Some Data:" />
      <p:autoComplete id="someData" value="#{someDataAutoCompleteBean.selectedOption}"
        completeMethod="#{someDataAutoCompleteBean.determineOptions}" forceSelection="true" required="true"
        requiredMessage="Data can not be blank." queryDelay="0"/>
      <p:commandButton update=":myDialog" value="Save and Stay" oncomplete="myDialogWidget.show()"/>
      <p:commandButton value="Save and Close" oncomplete="handleDialogSubmit(myDialogWidget, args)"/>
    </p:dialog>
  </h:form>