2013-01-11 67 views
4

我正在使用Primefaces的調度組件。我從數據庫值填充它,當用戶從selectOneMenu用於觸發一個Ajax事件選擇某事(我試圖把剛剛相關的代碼,如果有某事丟失請提醒我):Init方法在@Viewscoped bean中調用兩次

XHTML:

<h:outputText value="Scope :" /> 
<h:selectOneMenu id="scope" value="#{scheduleView.scope}">      
    <f:selectItems value="#{lookup.scopeCombo}"/> 
    <p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/> 
</h:selectOneMenu> 

<p:schedule id="schedule" value="#{scheduleView.model}" editable="true"/> 

支持bean:

@ManagedBean 
@ViewScoped 
public class ScheduleView implements Serializable { 

@PostConstruct 
    public void init() { 
     System.out.println("Init "); 
     scopeChange();     
    } 

    public void scopeChange(String scope){ 
     System.out.println("scopeChange "); 
     model.clear(); 
     events = (List<Event>) commonServis.bringEverythingByCriteria(Event.class, "scope" , scope); 
     for(int i= 0; i<events.size();i++){ 
     model.addEvent(new DefaultScheduleEvent(events.get(i).getAd(), events.get(i).getStartDate(),events.get(i).getEndDate())); 
    } 

    public void changeScopeType() { 
    System.out.println("changeScopeType "); 
     scopeChange (scope); 
} 

上述代碼的輸出是:

Init 
scopeChange 

當用戶更改selectOneMenu用於值:

changeScopeType 
Init 
scopeChange 

它應該進入init方法只有一次。但在changeScopeType函數被觸發後,它將進入init方法並使用不相關的數據填充計劃。我認爲它可能與@Postconstruct註釋有關,但我找不到任何相關的解釋。任何人都可以理解原因並提供解決方案嗎?

以下是完整的頁面:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:p="http://prime.primefaces.org/ui" 
       template="templates/layout.xhtml" 
       xmlns:c="http://java.sun.com/jsp/jstl/core"> 
    <ui:define name="title">#{labels.schedule}</ui:define> 
    <ui:define name="content"> 
     <h:form id="scheduleForm"> 
      <h:panelGrid id="scheduleFormPG"> 
       <p:growl id="msgs" /> 
       <p:dialog modal="true" widgetVar="statusDialog" header="Status" draggable="false"> 
        <h:graphicImage value="resources/images/ajax-loader.gif" /> 
       </p:dialog> 
       <p:dialog showEffect="explode" hideEffect="explode" resizable="false" 
         header="warning" widgetVar="confirmationErase" appendToBody="true" modal="true"> 
        <h:outputText value="Are you sure?"/> 
        <br/> 
        <p:commandButton value="Yes" actionListener="#{scheduleView.deleteEvent(AE)}" 
            update="msgs, scheduleFormPG, schedule, wrapperPanel" 
            onstart="statusDialog.show(),confirmationErase.hide()" 
            oncomplete="statusDialog.hide(), eventDialog.hide()" process="@parent, scope" /> 
        <p:commandButton value="No" onclick="confirmationErase.hide()" type="button" /> 
       </p:dialog>     
       <h:outputText value="scope :" /> 
       <h:selectOneMenu id="scope" value="#{scheduleView.scope}">      
        <f:selectItems value="#{lookup.scopeTypeCombo}"/> 
        <p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/> 
       </h:selectOneMenu>     
      </h:panelGrid>    
      <p:schedule onDateSelectUpdate="wrapperPanel" 
         onEventSelectUpdate="wrapperPanel" onEventSelectComplete="eventDialog.show()" eventSelectListener="#{scheduleView.onEventSelect}" 
         onDateSelectComplete="eventDialog.show();" dateSelectListener="#{scheduleView.onDateSelect}" id="schedule" value="#{scheduleView.model}" editable="true"/> 
      <p:dialog id="dialog111" widgetVar="eventDialog" header="Event Information" showEffect="clip" hideEffect="clip"> 
       <p:panel id="wrapperPanel">      
        <h:panelGrid id="eventDetails" columns="2"> 
         <h:outputLabel for="eventName" value="Event Name *: " /> 
         <p:inputText id="eventName" value="#{scheduleView.event.title}" required="true"/> 
         <h:outputLabel value="Start Date:" /> 
         <p:calendar id="sKalender" value="#{scheduleView.event.startDate}"> 
          <f:convertDateTime pattern="dd/MM/yyyy" /> 
         </p:calendar> 
         <h:outputLabel value="End Date:" /> 
         <p:calendar id="eKalender" value="#{scheduleView.event.endDate}"> 
          <f:convertDateTime pattern="dd/MM/yyyy" /> 
         </p:calendar> 
         <h:outputLabel value="All Day:" /> 
         <h:selectBooleanCheckbox id="allDay" value="#{scheduleView.event.allDay}" /> 
         <h:outputLabel value="scope: " /> 
         <h:selectOneMenu id="scopeChoice" value="#{scheduleView.event.scope}">      
          <f:selectItems value="#{lookup.scopeTypeCombo}"/> 
         </h:selectOneMenu>       
          <p:commandButton onclick="confirmationErase.show()" oncomplete="eventDialog.hide()" update="wrapperPanel, msgs, schedule" type="reset" value="Delete" /> 
         <p:commandButton value="Save" actionListener="#{scheduleView.addEvent(AE)}" process="@parent, scope" update="schedule wrapperPanel msgs scheduleForm" oncomplete="eventDialog.hide();"/> 
        </h:panelGrid> 
       </p:panel> 
      </p:dialog> 
      </h:form> 
    </ui:define> 
</ui:composition> 
+1

你引用'#{scheduleView}'像JSTL''或'id'或'JSF組件的binding'屬性的taghandler地方?另請參閱此相關問題:http://stackoverflow.com/questions/14215098/view-scoped-bean-recreated-on-post-when-url-parameters-not-used/14216971#14216971 – BalusC

+0

感謝您的評論。它不在JSTL 或id或綁定屬性中。但它使用如下:value =「#{scheduleView.scope}」或actionListener =「#{scheduleView.deleteEvent(AE)}或listener =」#{scheduleView.changeKapsamTipi()or rendered =「#{scheduleView.takvimTuruYillik} 「或eventSelectListener =」#{scheduleView.onEventSelect}「在p:commandButton,p:schedule,p:dataTable和h:selectonemenu組件中。 – lamostreta

+1

那麼,我沒有看到任何合理的原因。你在使用Spring嗎?我記得在安裝Spring時JSF部分狀態保存機制以某種方式中斷,導致所有視圖範圍的bean的行爲與請求範圍的行爲類似。您需要明確強制將'javax.faces.PARTIAL_STATE_SAVING'上下文參數強制爲'true'。 – BalusC

回答

1

問題是這行代碼:

<p:ajax process="scope" update="schedule, scheduleForm, scheduleFormPG" listener="#{scheduleView.changeScopeType()}"/> 

更新被刷新整個頁面,相反,它應該已經只更新時間表。當我將其更改爲:

update="schedule" 

問題解決了。 感謝大家的努力。