2013-03-23 40 views
3

我正在编写PrimeFaces应用程序。我在我的XHTML下面的代码:Primefaces selectOneMenu不会在更改时执行

<p:selectOneMenu value="#{lottoCheckerBean.selectedPowerBallDrawingDate}"> 
    <f:selectItems value="#{lottoCheckerBean.powerBallDrawingDates}" /> 
</p:selectOneMenu> 

我期待下面的代码中要执行我的LottoCheckerBean当值选择:

public void setSelectedPowerBallDrawingDate(String selectedPowerBallDrawingDate) { 
    //get drawing 
    PowerBallDrawing currentDrawing = null; 
    for (int d = 0; d < powerBallDrawings.size(); d++) { 
     if (powerBallDrawings.get(d).getDrawingDate().equals(selectedPowerBallDrawingDate)) { 
      currentDrawing = powerBallDrawings.get(d); 
      break; 
     } 
    } 
    if (currentDrawing == null) { 
     try { 
      //create new drawing; 
      currentDrawing = new PowerBallDrawing(selectedPowerBallDrawingDate); 
      powerBallDrawings.add(currentDrawing); 
      Arrays.sort(powerBallDrawings.toArray()); 
     } catch (Exception ex) { 
      //will not happen so ignore 
     } 
    } 
    this.selectedPowerBallDrawingDate = selectedPowerBallDrawingDate; 
} 

但是,如果我在设置断点上述方法的开始,没有达到断点。

我错过了什么?

回答

4

你期望在变化执行的代码将被调用时,你提交中,你selectOneMenu放置形式。这就是当selectOneMenu的值将传递给你的bean的时候。

如果你想执行在任何其他情况下的东西,如变化,您需要启用AJAX

<p:selectOneMenu value="#{lottoCheckerBean.selectedPowerBallDrawingDate}" > 
    <f:selectItems value="#{lottoCheckerBean.powerBallDrawingDates}" /> 
    <p:ajax event="change" listener="#{lottoCheckerBean.someMethod}" /> 
</p:selectOneMenu> 

当值的支持bean改变时,someMethod()将被称为。

我建议你只使用setSelectedPowerBallDrawingDate(String selectedPowerBallDrawingDate)作为设置值,而不是任何业务逻辑。然后让您从<p:ajax/>调用的方法执行业务逻辑。

+1

我唯一的补充是,OP可以通过向他的''标签添加'onchange =“submit()”'属性来同步显式地提交表单。 +1 – skuntsel 2013-03-23 17:51:10

+0

是的。但也许他宁愿只提交表格的一小部分(即selectOneMenu),即ajax方式。会导致传递的数据更少。我宁愿使用'p:ajax'标签。 – Magnilex 2013-03-23 17:55:30

相关问题