2012-03-19 55 views
1

我對preRenderView事件有點麻煩。我的頁面也使用commandbutton來提交數據,但不幸的是,preRenderView-Event總是在調用按鈕動作之前被調用。preRenderView - 動作之前觸發的事件(commandbutton)

preRenderView-Event負責加載服務中的數據。由於該頁面很簡單,並且不需要存儲任何數據,所以我不需要任何Session或ViewScoped-Beans。

據我所知,事件在渲染響應階段被調用,並且按鈕中的動作應該早一些發生。

<h:body> 
    <f:metadata> 
     <f:viewParam name="id" value="#{bean.id}" converter="converter.SetOfLongConverter"/> 
     <f:event type="preRenderView" listener="#{bean.initializeData}" /> 
    </f:metadata> 

    <ui:composition template="/META-INF/templates/myTemplate.xhtml"> 
     <ui:param name="title" value="#{bean.title}"/> 
     <ui:define name="content"> 
      <h:outputText value="#{bean.description}" /> 
      <h:form> 
        <h:panelGrid columns="2"> 
         <h:outputLabel value="Model" for="model" /> 
         <h:inputText id="model" value="#{bean.model}" /> 
         <h:outputLabel value="Manufacturer" for="manufacturer" /> 
         <h:inputText id="manufacturer" 
          value="#{bean.manufacturer}" /> 
         <h:outputLabel value="Year" for="year" /> 
         <h:inputText id="year" value="#{bean.year}" /> 
        </h:panelGrid> 
        <h:commandButton value="Create" type="submit" action="#{bean.create}" rendered="#{bean.createMode}"/> 
        <h:commandButton value="Save" type="submit" action="#{bean.save}" rendered="#{!bean.createMode}" /> 
       </h:form>  
     </ui:define> 
    </ui:composition> 
</h:body> 

我加了一些控制檯,消息驗證時,在bean的方法被調用,當我有preRenderView事件就不會發生。

任何意見,我在做什麼錯在這裏?

回答

1

<f:metadata>必須進入<ui:composition><ui:define>

<f:metadata> tag documentation(重點煤礦)查看:

聲明元數據方面的這一觀點。這必須是<f:view>的孩子。 此標記必須位於給定viewId的頂級XHTML文件中,或模板客戶端中,但不在模板中。實施必須確保該方面的直接孩子是UIPanel,即使該方面只有一個孩子。該實現必須將UIPanel的id設置爲UIViewRoot.METADATA_FACET_NAME符號常量的值。

簡單的原因是因爲元數據應該是視圖特定的,而不是模板特定的。


更新:事實證明,操作方法完全不調用。你在那裏有一個rendered屬性的命令按鈕,似乎根據症狀取決於基於請求的變量而不是基於視圖的變量。將託管bean放在視圖範圍中應該可以解決這個問題。另請參見commandButton/commandLink/ajax action/listener method not invoked or input value not updated

+0

感謝您的澄清,但它仍然不會觸發此操作。我使用鏈接提供的示例,定義了f:視圖和元數據定義部分。 – lostiniceland 2012-03-19 15:04:24

+0

哦,bean操作方法**根本不會被調用**?你的問題不太清楚。我明白它是在偵聽器方法之後調用的,我猜測它是由可能導致不確定行爲的''的錯誤位置引起的。我現在看到你在按鈕上有一個「渲染」屬性(由於它在視口之外,所以我避免了注意)。在這種情況下,將bean放入視圖範圍應該修復它。另見http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked第5條 – BalusC 2012-03-19 15:06:24

+0

多數民衆贊成它......謝謝。也許我可以找到另一種解決方案,所以我不需要ViewScope。 – lostiniceland 2012-03-19 15:17:26

相關問題