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中的一个错误。任何人都可以确认或提供解决方案/解决方法吗?
答案 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>