2015-08-30 63 views
0

我使用JSF2.2和primefaces 5.2。JSF - 自定義標記 - selectonemenu - ajax監聽器

我的頁面包含Primefaces的本機代碼。 IT WORKS:與我的自定義標籤

<p:selectOneMenu id="continent" value="#{programController.continentCode}"> 

     <p:ajax listener="#{programController.onContinentChange}" 
      update=searchForm:country" 
      immediate="true" /> 

     <f:selectItems value="#{programController.continent.listResult}" 
      var="item" 
      itemLabel="#{item.name}" itemValue="#{item.code}" /> 

</p:selectOneMenu> 

我的頁面。 它不工作

<mp:select_one id="continent" rendered="true" required="false" 
          label="#{bundleMessage['label.key']}" 
          value="#{programController.continentCode}" 
          list="#{programController.continents.listResult}" 
          item_label="#{item.name}" item_value="#{item.code}" 
          listener="programController.onContinentChange" 
          update="search_form:country" immediate="true"/> 

我的自定義標籤:

<p:selectOneMenu id="#{id}" styleClass="#{styleClass}" required="#{required}" value="#{value}" rendered="#{rendered}"> 

     <p:ajax listener="#{listener}" 
       update="#{update}" 
       immediate="#{immediate}" /> 

     <f:selectItems value="#{list}" 
      var="item" 
      itemLabel="#{item_label}" itemValue="#{item_value}" /> 

</p:selectOneMenu> 

錯誤與自定義標籤的使用報告:

com.sun.faces.lifecycle.ApplyRequestValuesPhase execute 
WARNING: /WEB-INF/mp-tags/select_one.xhtml @119,33 listener="#{listener}": Identity 'listener' does not reference a MethodExpression instance, 
returned type: java.lang.String 
javax.el.ELException: /WEB-INF/mp-tags/select_one.xhtml @119,33 listener="#{listener}": Identity 'listener' does not reference a MethodExpression instance, returned type: java.lang.String 

我的控制器:

public void onContinentChange() { 
    LOGGER.logDebug(">>>>>>>>>>>>>>>>>>>> {%s}", continentCode); 
    countries = list("COUNTRY_BY_CONTINENT", new String[] {continentCode}); 
} 

public ListBean getCountries() { 
    return countries; 
} 

感謝您的回答

回答

0

我認爲這是因爲您要爲自定義標記的listener屬性設置String值,而不是方法表達式。通過#{}包裹屬性值:

listener="#{programController.onContinentChange}" 
+0

如果我用這句話我檢索另一個錯誤,如「不能存在於內側programController名爲‘onContinentChange’屬性」 這是正確的,因爲它是一種方法不是一個屬性獲取/設置方法。 –

+0

如果您在方法中添加括號,該怎麼辦:'「#{programController.onContinentChange()}」'? – Omar

+0

listener =「programController.onContinentChange()」not work –