我已经在很长一段时间内处理过这个问题了。当我在selectOneMenu中选择一个项目时,我想更新另一个具有特定值的selectOneMenu,但它无效。
XHTML:
<p:dialog id="noviTermin_dlg" header="Upisi podatke o terminu" widgetVar="termin_dlg" modal="true"
height="250" width="500">
<h:panelGroup id="noviTerminPanel">
<p:panelGrid columns="2">
<h:outputText value="Pacijent:" />
<p:selectOneMenu id="pacijentiList" value="#{termini.selectedPacijent}"
filter="true" filterMatchMode="contains">
<p:ajax listener="#{termini.writeSomething}"
update="bolestiList" />
<f:selectItem itemLabel="Odaberi pacijenta" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{termini.pacijenti_list}" var="pacijent"
itemLabel="#{pacijent.pacijent_prezime} #{pacijent.pacijent_ime}"
itemValue="#{pacijent}" />
</p:selectOneMenu>
<h:outputText value="Bolest:" />
<p:selectOneMenu id="bolestiList" value="#{termini.selectedBolest}"
filter="true" filterMatchMode="contains" disabled="#{empty selectedPacijent}">
<f:selectItem itemLabel="Odaberi bolest" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{termini.bolesti_list}" var="bolest"
itemLabel="#{bolest.naziv_bolesti}"
itemValue="#{bolest}" />
</p:selectOneMenu>
<h:outputText value="Vrijeme pocetka:" />
<pe:timePicker mode="popup" />
<h:outputText value="Vrijeme kraja:" />
<pe:timePicker mode="popup" />
<f:facet name="footer">
<p:commandButton value="Spremi" icon="fa fa-save"
process="noviTerminPanel"
update="table_termini"
oncomplete="PF('termin_dlg').hide();"></p:commandButton>
</f:facet>
</p:panelGrid>
</h:panelGroup>
</p:dialog>
ManagedBean:
@ManagedBean(name="termini")
@ViewScoped
public class TerminiBean implements Serializable{
private List<Pacijenti> pacijenti_list;
private Pacijenti selectedPacijent;
private List<PovijestBolesti> bolesti_list;
private PovijestBolesti selectedBolest;
//+get set
public void writeSomething() {
System.out.println("adasd");
}
转换器:
@FacesConverter(forClass=Pacijenti.class)
public class PacijentiConverter implements Converter {
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
if (value == null || value.isEmpty()) {
return null;
}
try {
Pacijenti pac = new Pacijenti();
for(Pacijenti p : CommonServices.fetchPacijentiFromDB()) {
if(value == p.getPacijent_id()) {
pac = p;
}
}
return pac;
} catch (Exception e) {
throw new ConverterException(new FacesMessage(value + " is not a valid Warehouse ID"), e);
}
} catch(NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid theme."));
}
}
else {
return null;
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) {
return "";
}
if (value instanceof Pacijenti) {
return String.valueOf(((Pacijenti) value).getPacijent_id());
} else {
throw new ConverterException(new FacesMessage(value + " is not a valid Warehouse"));
}
}
}
在这个例子中,当我点击selectOneMenu中的项目时,我只是想在控制台中写一些东西。
注意:我们只发布了与此问题相关的代码。
答案 0 :(得分:1)
在包含事件处理或其他叠加组件的对话框出现大量问题之后,我得到了以下模式:单独的表单用于单独的组件。每个对话框一个表单。对话形式嵌入。
您的活动符号看起来不错,应该恕我直言。 如果事件有效并且更新没有:您还可以尝试更新父项而不是输入组件(例如@form或@parent或noviTerminPanel。
祝你好运。