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