【问题标题】:selecting item from primeface's selectOneMenu not working从primefaces selectOneMenu中选择项目不起作用
【发布时间】:2011-09-29 11:37:21
【问题描述】:

我在从 selectOneMenu 获取所选项目时遇到问题。
这是我的 JSF 代码:

<h:form id="mainfrm">   
    <h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">  
        <h:outputText value="Basic Usage: " />  
        <p:selectOneMenu id="domaine" value="#{projet.currentDomaines}">  
            <f:selectItem itemLabel="Select One" itemValue="" />  
            <f:selectItems value="#{projet.initDomaines()}"  var="d" itemValue="#{d}" itemLabel="#{d.libelleDomaine}" /> 
            <p:ajax update="formEquipe" process="mainfrm" event="change" />
        </p:selectOneMenu>
     </h:panelGrid>     

</h:form>  

<h:form id="formEquipe">  
    <h:panelGrid id="display" columns="2" cellpadding="4">  
        <f:facet name="header">  
            <p:graphicImage value="/images/cars/xxxx.jpg"/>  
        </f:facet>  

        <h:outputText value="Domaine name :" />  
        <h:outputText value="#{projet.currentDomaines.libelleDomaine}"/>  

        <h:outputText value="Director :" />  
        <h:outputText value="#{projet.currentDomaines.nomDirecteur}" />  
    </h:panelGrid>  
</h:form>

似乎一切都是正确的,但我必须遗漏一些东西......所以我通过文本(字符串)更改 currentDomaines(对象类型 Domaines)进行了测试,它起作用了,这里是代码:

<h:form id="mainfrm">   
    <h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">  
        <h:outputText value="Basic Usage: " />  
        <p:selectOneMenu id="domaine" value="#{projet.text}">  
            <f:selectItem itemLabel="Select One" itemValue="" />  
            <f:selectItems value="#{projet.initDomaines()}"  var="d" itemValue="#{d.libelleDomaine}" itemLabel="#{d.libelleDomaine}" /> 
            <p:ajax update="formEquipe" process="mainfrm" event="change" />
        </p:selectOneMenu>
    </h:panelGrid>     
</h:form>  

<h:form id="formEquipe">  
    <h:panelGrid id="display" columns="2" cellpadding="4">  
        <f:facet name="header">  
        <p:graphicImage value="/images/cars/xxxx.jpg"/>  
        </f:facet>  

        <h:outputText value="Domaine name :" />  
        <h:outputText value="#{projet.text/>  
    </h:panelGrid>  
</h:form>

这是我的支持 bean:

public class ProjetsBean implements Serializable {

   private  DomainesService domainesService;

   private Domaines currentDomaines;
   private String text;


   /////////////// setters & getters \\\\\\\\\\\\\\\\\\\
   public void setCurrentDomaines(Domaines currentDomaines) {
       this.currentDomaines=currentDomaines;
   }
   public Domaines getCurrentDomaines() {
       return currentDomaines;
   }

   public void setText(String text) {
       this.text=text;
   }
   public Integer getText() {
       return text;
   }

   ///////////////// Méthodes  \\\\\\\\\\\\\\\
   @PostConstruct   
   public List<Domaines> initDomaines() {
       return domainesService.getAllDomaines();
   }  
}

【问题讨论】:

    标签: jsf primefaces selectonemenu


    【解决方案1】:

    来自 html 选择框的选择将始终作为字符串返回给服务器。如果你想使用h:selectOneMenu 中的对象,你需要一个转换器。

    有一个关于该主题的综合教程:"Objects in h:selectOneMenu"

    【讨论】:

      【解决方案2】:

      在大多数情况下,您可以在没有转换器的情况下完成此操作,但这并没有错。

      这是一个例子:

      <h:selectOneMenu value="#{bean.selectedObject.id}">
          <f:selectItems value="#{bean.listOfObjects}" var="item" itemLabel="#{item.title}" itemValue="#{item.id}" />
      </h:selectOneMenu>
      

      另一个想法是使用哈希码而不是 ID(但同时使用:itemValue 和 value)。

      【讨论】:

      • 此特定示例仅更改所选对象的 ID,这不会更改所选对象本身或其任何其他属性。除非您事后手动替换选定的对象,否则这将在基于对象的持久层(例如 JPA)中产生重大问题。如果您改用#{bean.selectedObjectId},您的示例会更有效。
      猜你喜欢
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2015-03-04
      • 2015-04-28
      • 2015-09-03
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      相关资源
      最近更新 更多