父母:
<p:selectOneMenu id="parentList"
value="#{bean.selectedParent}"
converter="#{parentConverter}"
required="true">
<f:selectItem itemLabel="Select" itemValue="#{null}"/>
<f:selectItems var="parent"
value="#{bean.parentList}"
itemLabel="#{parent.parentName}"
itemValue="#{parent}"/>
<p:ajax update="childrenList" listener="#{bean.setchildren}"/>
</p:selectOneMenu>
儿童:
<p:selectOneMenu id="childrenList"
value="#{bean.selectedchild}"
converter="#{childConverter}"
required="true">
<f:selectItem itemLabel="Select" itemValue="#{null}"/>
<f:selectItems var="child"
value="#{bean.childrenList}"
itemLabel="#{child.childName}"
itemValue="#{child}"/>
</p:selectOneMenu>
托管bean:
@Named
@ViewScoped
public class Bean implements Serializable {
@Inject
private Service service;
private Parent selectedParent;
private Child selectedChild;
private List<Parent> parentList;
private List<Child> childrenList;
private static final long serialVersionUID = 1L;
public Bean() {}
@PostConstruct
private void init() {
parentList = service.getParentList();
// Not necessary unless selectedParent is already available in edit mode.
if(selectedParent != null) {
childrenList = service.getChildrenListByParent(selectedParent);
}
}
public void setChildren() {
if(selectedParent != null) {
childrenList = service.getChildrenListByParent(selectedParent);
} else {
childrenList = null;
}
}
// Getters and setters.
}
子列表将根据其父级填充,即子列表应仅包含与特定父级关联的子级。
当选择父列表中的第一个父项时,子项列表应重置为空,即子项不应在没有父项的情况下可见。
由于父列表具有必需的字段验证器,因此会导致验证。当选择父列表中的第一个项目时,将阻止子列表因required="true"
而更新。技术上没有任何错误,但没有父母的孩子的存在可能会给最终用户带来不愉快的经历。
应该发生的情况是,当选择父列表中的第一项时,它不应导致验证,即有条件地跳过验证。
执行此操作的一种方法是检查selectedChild
或childrenList
本身是否为空/空。如,
required="#{empty selectedChild or empty childrenList}"
但在这种情况下,这似乎不是有条件地跳过验证的规范方式。
当选择父列表中的第一项时,是否存在跳过验证的更好方法,以便子列表以及父列表也可以清空(验证应该在所有其他情况下引起。例如。 ,当表单本身同步或异步提交时?)
答案 0 :(得分:3)
基本上,您需要依赖于操作的验证。即在调用特定$calls = mysql_result(mysql_query("SELECT calls FROM ae8vo_survey WHERE people_id = '1'"), 0);
echo $calls;
操作时跳过验证,而不是在其他操作上跳过验证。
遗憾的是,在视图中宣布这一点并非微不足道。有几个技巧/解决方法。最常用的是检查是否(未)调用特定操作。
E.g。通过HTTP request parameter map <p:ajax>
确认implicit EL object中是否存在客户ID,检查是否调用了所需的保存按钮:
#{param}
或者通过确定组件自己的客户端ID是否不等于具有预定义名称<h:form>
<p:selectOneMenu ... required="#{not empty param[save.clientId]}">
...
<p:ajax ... />
</p:selectOneMenu>
<p:selectOneMenu ... required="true">
...
</p:selectOneMenu>
<p:commandButton binding="#{save}" ... />
</h:form>
的HTTP请求参数来检查组件自己的<p:ajax>
是否未被调用。 ajax请求(下面的javax.faces.source
是一个表示当前UIComponent
的隐式EL变量):
#{component}
或者检查父表单是否由UIForm#isSubmitted()
提交,该表单只会在&#34;完整表单提交时评估<h:form>
<p:selectOneMenu ... required="#{param['javax.faces.source'] ne component.clientId}">
...
<p:ajax ... />
</p:selectOneMenu>
<p:selectOneMenu ... required="true">
...
</p:selectOneMenu>
<p:commandButton ... />
</h:form>
。用作true
process="@form"
默认为<p:ajax process>
,不会触发&#34;完整表单提交&#34;和@this
默认值到<p:commandButton process>
,这将触发&#34;完整表格提交&#34;):
@form
或者通过UIComponent#getNamingContainer()
引用表单来绑定表单(如果您知道组件树中的位置;如果表单是例如2个命名容器父项,则使用<h:form binding="#{form}">
<p:selectOneMenu ... required="#{form.submitted}">
...
<p:ajax ... />
</p:selectOneMenu>
<p:selectOneMenu ... required="true">
...
</p:selectOneMenu>
<p:commandButton ... />
</h:form>
):< / p>
#{component.namingContainer.parent.namingContainer.submitted}
接受你的选择。第一个解决方案之前已经提供过几次,因为它最容易理解并且由初学者调整。