2012-05-24 130 views
1

我希望在primefaces 3.2的tabview的每个选项卡中显示2个不同的数据表。 那里的datatables将基于onChange事件中设置的'type'变量来获取数据。但我的问题是onChange事件根本不会触发。 请检查我TabView的代码来检查为什么发生这种情况:primefaces tabview onChange not fired

<h:form id="frm"> 
     <p:tabView activeIndex="#{equityBean.activeIndex}"> 
      <p:ajax event="tabChange" listener="#{equityBean.onChange}" update=":frm"/> 
      <p:tab title="NSE" binding="#{equityBean.tbn}"> 


       <p:dataTable binding="#{equityBean.dt}" value="#{equityBean.scripList}" var="scrip"> 
        <f:facet name="header"> 
       Scrip Symbol 
      </f:facet> 
       <h:outputText value="#{scrip.scripSymbol}"/> 
       <f:facet name="header"> 
       Company Name 
      </f:facet> 
       <h:outputText value="#{scrip.companyName}"/> 
       <f:facet name="header"> 
       Volume 
      </f:facet> 
       <h:outputText value="#{scrip.totalTradedVolume}"/> 
       </p:dataTable> 
      </p:tab> 
      <p:tab title="BSE" binding="#{equityBean.tb}"> 

      </p:tab> 
     </p:tabView> 
    </h:form> 

豆:

public void onChange(TabChangeEvent event) { 
type=event.getTab().getTitle(); 
} 

编辑: 豆代码来获取数据表值:

public List<MasterScrip> getScripList() { 
    scripList=new ArrayList<MasterScrip>(); 
scripList=getScripByVolumeType(type); 
    return scripList; 
} 
private java.util.List<service.MasterScrip> getScripByVolumeType(java.lang.String type) { 
    service.StatelessWebService port = service.getStatelessWebServicePort(); 
    return port.getScripByVolumeType(type); 
} 

编辑:jpa查询

public Collection<MasterScrip> getScripByVolumeType(String type) 

{ Collection sm = null;

 sm=em.createQuery("select m from MasterScrip m where m.type = :type order by m.totalTradedVolume").setParameter("type", type).setMaxResults(2).getResultList(); // retuens no records 
     return sm; 
    } 

返回的记录,但不显示..

为什么会发生这种情况?我在哪里错了?

回答

2

你的错误在这里。

listener="#{equityBean.onChange(event)}" 

event对象在EL范围内不存在。删除参数。你根本不需要指定它。 JSF将自己提供必要的动作监听器参数。

listener="#{equityBean.onChange}" 

这同样适用于其他所有listeneractionListener属性如此。只有在属性UICommand组件中,您可以指定自定义参数(应使用实数值传递自定义参数,而不要使用一些随机且不存在的变量名称)。

+0

这样做(编辑问题)仍然无法正常工作,我调试并发现该事件从未执行过,取而代之的是获取数据表值(正在编辑)并持续获取它,导致无限调试循环 – z22

+1

每次EL表达式被评估时你都应该调用getter(你应该*现在*的头上有灯泡,这说明它确实是一个[坏主意])(http://stackoverflow.com/questions/2090033/why- jsf-calls-getters-multiple-times/2090062#2090062)在getter方法中执行业务逻辑!)。但这与您的标签更改问题无关。或者,如果您完全删除了“”,它会得到解决吗?顺便说一下,我发现那些“绑定”属性是可疑的。毕竟,如果他们确实造成了具体问题,我不会感到惊讶。 – BalusC

+0

hanks BalusC!我走到了永无止境的getter循环的末端(是的,在getter中编写代码真的是个不好的主意)jpa查询正在返回记录,但记录不会显示在数据表中... – z22