【问题标题】:primefaces selectonemenu on change event not working更改事件上的primefaces selectonemenu不起作用
【发布时间】:2018-05-30 08:43:20
【问题描述】:

我已经处理这个问题已经有一段时间了。当我在 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(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 中的项目时,我只是想在控制台中写一些东西。

注意:我只发布了与此问题相关的代码。

【问题讨论】:

  • 尝试将视图包裹在
    中,如 primefaces 示例 primefaces.org/showcase/ui/ajax/dropdown.xhtml
  • 整个正文在
    内。
  • @Ovoxo 还有,连陈列柜都不能用是不是很好奇?
  • 展示“不起作用”,但如果您调试,您将在网络选项卡中看到返回的响应,其中包含正确的城市。所以只有ui部分没有更新。你的 PF 版本是多少?
  • 6.2,我尝试切换到旧版本,它仍然是一样的。

标签: ajax primefaces dropdown selectonemenu


【解决方案1】:

在一个大型主窗体中包含事件处理或其他覆盖组件的对话框出现大量问题后,我最终采用了以下模式:单独的窗体用于单独的组件。每个对话框一个表单。对话框嵌入表单。

您的事件符号看起来不错,恕我直言应该可以工作。 如果事件有效而更新无效:您还可以尝试更新父组件而不是输入组件(例如 @form 或 @parent 或 noviTerminPanel。

祝你好运。

【讨论】:

  • “上帝”形式是邪恶的...stackoverflow.com/questions/7371903/…
  • @Kukeltje - 是的,这就是我建议不要使用的原因。还发布整个表单是默认设置(除非您不使用进程和/或部分处理),这是一个不好的做法,JSF 应用程序越大。
  • ;-),我应该发布:“上帝”形式确实是邪恶的(我同意你的观点)
  • 仍然没有成功。我尝试切换到简单的文本 selectItem 值并且它可以工作,但这并不是我真正需要的......
  • 奇怪。也许您想测试更简单的选择来发现问题:只是一个带有简单选择的普通页面,两个修复条目,没有和有对话框。或者只是 p:ajax 中“oncomplete”的 javascript“console.log”。你检查过javascript控制台的错误吗?发生错误时,Javascript 可能会在页面中停止工作。
猜你喜欢
  • 2012-12-10
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 2012-12-21
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多