以下两段代码之间有什么区别 - 关于listener放置?
<h:selectOneMenu ...>
<f:selectItems ... />
<f:ajax listener="#{bean.listener}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
和
<h:selectOneMenu ... valueChangeListener="#{bean.listener}">
<f:selectItems ... />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud) 我有3个列表框:第一个包含类型,第二个包含所选类型的子类型,第三个包含所选类型和子类型的元素.
<p:selectonelistbox id = "types" rendered = "true" valuechangelistener = "#{bean.selectType}" onchange = "submit()" />
<p:selectonelistbox id = "subtypes" rendered = "#{bean.subtypesFlag}" valuechangelistener = "#{bean.selectSubType}" onchange = "submit()" />
<p:selectonelistbox id = "elements" rendered = "#{bean.elementsFlag}" />
@viewscoped
...
private Boolean subtypesFlag = false;
private Boolean elementsFlag = false;
public void selectType(ValueChangeEvent event) {
subtypesFlag = true;
elementsFlag = false;
}
public void selectSubType(ValueChangeEvent event) {
elementsFlag = true;
}
Run Code Online (Sandbox Code Playgroud)
始终显示第一个列表框,仅在选择某个类型时显示第二个列表框,仅在选择子类型时显示第三个列表框.
当我打开视图时,只渲染类型.然后我按某种类型,亚型变得可见.接下来我按下一些子类型,元素变得可见.一切都很好.
但是当我选择另一种类型时,我想只显示子类型,但没有元素列表框.我有一个问题.当我真正选择其他类型时,我可以看到所有三个列表框.当我再次按下另一种类型时,我只看到类型和子类型,没有元素列表框.
这似乎是一个有趣的事实,当在应用请求值阶段时,您的组件将标志设置为false并且在验证阶段(当调用值操作侦听器时)变为 …
关于jsf相关的下拉选择,我在这里遇到了一个小问题.我有2个下拉选择:第一个是独立的,第二个显示结果依赖于这是代码:
<h:panelGroup id="addressPanel">
<h:outputLabel styleClass="label" value="Provincia: " />
<h:selectOneMenu onchange="updateCombos()"
value="#{indirizzoCtrl.codiceProvincia}" >
<f:selectItem itemValue="" itemLabel=""></f:selectItem>
<f:selectItems value="#{indirizzoCtrl.allProvincia}" var="c"
itemLabel="#{c.nome}" itemValue="#{c.siglaProvincia}" />
</h:selectOneMenu>
<h:outputLabel styleClass="label" value="Comune: " />
<h:selectOneMenu
value="#{indirizzoCtrl.codiceComune}" >
<f:selectItem itemValue="" itemLabel=""></f:selectItem>
<f:selectItems value="#{indirizzoCtrl.allComuni}" var="c"
itemLabel="#{c.descrizione}" itemValue="#{c.codiceComune}" />
</h:selectOneMenu>
</h:panelGrid>
</h:panelGroup>
<p:remoteCommand name="updateCombos" update="addressPanel masterForm:msg" />
<p:commandButton styleClass="commandButton" value="Save"
actionListener="#{indirizzoCtrl.save}">
</p:commandButton>
Run Code Online (Sandbox Code Playgroud)
好吧,当用户在选择了两个值后保存表单时,托管bean indirizzoCtrl(请求作用域)无法将第二个下拉列表的值映射回列表,因为没有列表.事实上,#{indirizzoCtrl.allComuni}只有在indirizzoCtrl.codiceProvincia!=null...更新模型阶段之前,才调用从数据库检索数据的getter .因此,第一次调用列表的getter时无法检索任何值,这会使更新模型阶段失败.我怎么能处理这个场景......我认为这是一个很常见的场景,所以我在这里遗漏了一些东西......
我有2个<h:selectOneMenu>组件,其中一个取决于另一个组件的选择.当您选择的第一个菜单组件,然后用该事件的第二个变化的一个值onchange="submit()"和valueChangeListener="#{Usuario.cmbDatos_action}"第一菜单:
<h:selectOneMenu id="cmbCombo" binding="#{Usuario.cmbDatos}" value="#{Usuario.id}"
onchange="submit()" valueChangeListener="#{Usuario.cmbDatos_action}">
<f:selectItems value="#{beanCombos.datos}"></f:selectItems>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
它就像所选国家的国家和城市.第一个菜单加载如下:
@ManagedBean
@RequestScoped
public class BeanCombos {
private List<SelectItem> Datos;
public BeanCombos() {
try {
clsConexion objConexion = new clsConexion();
String strSQL = "SELECT * FROM Usuarios";
objConexion.ResultSetSQL = objConexion.EjecutarConsulta(strSQL);
Datos = new ArrayList<SelectItem>();
while (objConexion.ResultSetSQL.next()) {
Usuario objUsuario = new Usuario();
objUsuario.setId(String.valueOf(objConexion.ResultSetSQL.getInt("Codigo")));
objUsuario.setNombre(objConexion.ResultSetSQL.getString("Nombres").toUpperCase());
Datos.add(new SelectItem(objUsuario.getId(), objUsuario.getNombre()));
}
} catch(Exception ex) {
String strError = ex.getMessage().toString();
}
}
public List<SelectItem> getDatos() {
return Datos; …Run Code Online (Sandbox Code Playgroud) 有没有办法根据用户从selectOneMenu组件中选择的当前值渲染组件?我的selectOneMenu组件填充了一个由两个值组成的枚举,吸烟者和非吸烟者.如果用户选择了吸烟者,我想在其下方呈现一个复选框,让用户检查他们每天抽烟的次数10,20,30 +等.如果用户选择非吸烟者,我也希望相反的工作即复选框不会渲染/消失.