【问题标题】:selectOneMenu ajax eventsselectOneMenu ajax 事件
【发布时间】:2013-05-11 08:31:31
【问题描述】:

我正在使用可编辑的 primefaces selectOneMenu 来显示一些值。如果用户从列表中选择一个项目,则应该更新文本区域。但是,如果用户在 selectOneMenu 中键入内容,则不应更新 textarea。

我认为我可以使用 ajax 事件来解决这个问题。但是,我不知道我可以在这里使用哪个事件。我只知道valueChange 事件。是否还有其他活动,例如onSelectonKeyUp

这是我的代码:

<p:selectOneMenu id="betreff" style="width: 470px !important;"  
            editable="true" value="#{post.aktNachricht.subject}">
            <p:ajax event="valueChange" update="msgtext"
                listener="#{post.subjectSelectionChanged}" />
            <f:selectItems value="#{post.subjectList}" />
</p:selectOneMenu>

<p:inputTextarea style="width:550px;" rows="15" id="msgtext"
        value="#{post.aktNachricht.text}" />

【问题讨论】:

    标签: ajax jsf primefaces


    【解决方案1】:

    您可以检查您的selectOneMenu 组件的值是否属于主题列表。

    即:

    public void subjectSelectionChanged() {
        // Cancel if subject is manually written
        if (!subjectList.contains(aktNachricht.subject)) { return; }
        // Write your code here in case the user selected (or wrote) an item of the list
        // ....
    }
    

    假设subjectList 是一个集合类型,如ArrayList。当然,如果用户写入您的selectOneMenu 列表中的一项,您的代码将在此处运行。

    【讨论】:

      【解决方案2】:

      PrimeFaces ajax 事件有时没有很好的文档记录,因此在大多数情况下,您必须自己查看源代码。

      p:selectOneMenu 支持 change 事件:

      <p:selectOneMenu ..>
          <p:ajax event="change" update="msgtext"
              listener="#{post.subjectSelectionChanged}" />
          <!--...-->
      </p:selectOneMenu>
      

      在签名中使用AjaxBehaviorEvent 作为参数触发监听器:

      public void subjectSelectionChanged(final AjaxBehaviorEvent event)  {...}
      

      【讨论】:

      • 现在不需要事件名称,我们可以使用
      【解决方案3】:

      请注意,在您的 selectOneMenu 组件运行之前,该页面不包含任何“required”属性为“true”的空组件。
      如果您使用诸如

      之类的组件
      <p:inputText label="Nm:" id="id_name" value="#{ myHelper.name}" required="true"/>
      

      那么,

      <p:selectOneMenu .....></p:selectOneMenu>
      

      忘记填写需要的组件,无法执行selectoneMenu的ajax监听。

      【讨论】:

        【解决方案4】:

        我宁愿使用更方便的itemSelect 事件。通过此事件,您可以在侦听器中使用 org.primefaces.event.SelectEvent 对象。

        <p:selectOneMenu ...>
            <p:ajax event="itemSelect" 
                update="messages"
                listener="#{beanMB.onItemSelectedListener}"/>
        </p:selectOneMenu>
        

        有了这样的听众:

        public void onItemSelectedListener(SelectEvent event){
            MyItem selectedItem = (MyItem) event.getObject();
            //do something with selected value
        }
        

        【讨论】:

          猜你喜欢
          • 2014-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 2012-09-06
          • 2014-11-20
          • 2012-09-20
          • 2012-12-10
          相关资源
          最近更新 更多