1

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”,导致建议列表为空。primefaces 愉快地继续,好像有什么东西真的在那里。

如果自动完成组件不在对话框中,则不存在此问题。设置 appendToBody="true" 并不能解决它。

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

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

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

4

1 回答 1

0

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

  <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>
于 2013-10-22T13:34:40.333 回答