2017-07-01 3 views
1

Ich habe eine Befehlsschaltfläche, die die erforderlichen Daten in einem Formular einnimmt und dann ein DefaultScheduleModel zusammen mit allen DefaultScheduleEvents erstellt. Die Befehlsschaltfläche sollte dann ein anderes Formular aktualisieren, das TabView enthält, indem dynamisch eine neue Registerkarte und ein neuer Zeitplan zusammen mit allen Ereignissen erstellt wird, die erstellt werden müssen.Hinzufügen von Primitiven Planen und Planen von Ereignissen dynamisch auf Ajax-Update

Das Problem ist, dass aus irgendeinem Grund die neuen Registerkarten zusammen mit den entsprechenden Zeitplänen/Ereignissen nicht nach Ajax-Update erstellt werden. Das einzige, was ich bekomme, ist ein Tab mit einem leeren Zeitplan, bei dem alle nachfolgenden Übermittlungen keine zusätzlichen Tabs/Zeitpläne/Ereignisse erzeugen.

Hier ist meine Ansicht:

<h:form> 

     <b:panel id="createSchedule" title="Create Schedule-o-matic" > 

       <f:facet name="append"> 
        <b:commandButton look="danger" value="Delete" ajax="true" actionListener="#{onCallJSFBean.deleteTeamMember(teamMember)}" iconAwesome="times" icon-align="right" 
          update="rosterTable"/> 
       </f:facet> 
       </b:inputText> 
      </h:column> 
      </h:dataTable> 
      <b:commandButton value="Add Team Member" ajax="true" update="createSchedule" actionListener="#{onCallJSFBean.addTeamMember}"/> 
      <f:facet name="footer"> 
      <b:buttonToolbar> 
       <b:buttonGroup> 
       <b:commandButton id='scheduleCancel' look="danger" ajax="true" value="Close" icon-awesome="window-close" update="createSchedule" 
         onclick="ajax:onCallJSFBean.cancelSchedule();" 
         oncomplete="$('#j_id_12\\:createSchedule').hide();"/> 
       <b:commandButton id='scheduleCreate' look="success" ajax="true" value="Submit" icon-awesome="fa-check" 
         actionListener="#{onCallJSFBean.createSchedule()}" update="@(.scheduleClass)" 
         /> 
       </b:buttonGroup> 
      </b:buttonToolbar> 
      </f:facet> 

     </b:panel> 

      </h:form> 
<h:form class="scheduleClass"> 
      <b:row> 
      <p:tabView dynamic="true" value="#{onCallJSFBean.scheduleDOs}" var="scheduleList" scrollable="true"> 
       <p:tab title="#{scheduleList.scheduleTitle}"> 
       <h:outputText value="#{scheduleList.startTime} #{scheduleList.endTime} #{scheduleList.scheduleModel.eventCount}"/> 

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

Und hier ist der jeweilige Controller:

//When canceling/closing the schedule creation panel  
public void cancelSchedule(){ 
     this.createScheduleTitle=""; 
     this.createScheduleCycleTime = null; 
     this.slotStartTimePeriod = null; 
     this.slotEndTimePeriod = null; 
     this.createScheduleRoster = new ArrayList<>(); 
     System.err.println(scheduleDOs.size()); 
} 

     public void createSchedule(){ 


     if(submitFail == true){ 
      this.scheduleDOs.add(createScheduleData()); 
      System.err.println(this.scheduleDOs.size()+" Size of tab"); 
     } 

     System.err.println("Finished"); 
     } 

     private ScheduleDO createScheduleData(){ 
     ScheduleModel scheduleModel = new DefaultScheduleModel(); 

     if(createScheduleCycleTime == 1){ 
      populateDailySchedule(scheduleModel); 
     } 

     ScheduleDO onCall = new ScheduleDO(createScheduleTitle, createScheduleCycleTime, 
      slotStartTimePeriod, slotEndTimePeriod, createScheduleRoster, scheduleModel); 

     return onCall; 
     } 

     private int rosterCounter = 0; 
     private String nextTeamMember(List<SimpleStringWrapper> roster){ 
     String tmp; 
     if(rosterCounter >= roster.size()){ 
      rosterCounter=0; 
      tmp = roster.get(rosterCounter).getValue(); 
     }else{ 
      tmp = roster.get(rosterCounter).getValue(); 
     } 
     rosterCounter+=1; 
     return tmp; 
     } 

     private void populateDailySchedule(ScheduleModel scheduleModel){ 
     DateTime startDate = DateTime.now(); 
     Period period = Period.months(6); 
     DateTime endDate = startDate.plus(period); 
     Days day = Days.daysBetween(startDate, endDate); 

     int numDays = day.getDays(); 

     for(int i = 0;i<numDays;i++){ 
      MutableDateTime startTime = new MutableDateTime(startDate.plusDays(i)); 
      startTime.setHourOfDay(this.slotStartTimePeriod); 
      MutableDateTime endTime = new MutableDateTime(startDate.plusDays(i)); 
      endTime.setHourOfDay(this.slotEndTimePeriod); 

      String teamMember = nextTeamMember(createScheduleRoster); 
    //  System.err.println(teamMember+" "+startTime.toDate()+" "+endTime.toDate()); 
      DefaultScheduleEvent event = new DefaultScheduleEvent(teamMember, startTime.toDate(), endTime.toDate()); 
      scheduleModel.addEvent(event); 
     } 
     System.err.println(scheduleModel.getEventCount()); 
     } 

Ich verwende Primefaces 6.0 zusammen mit Bootsfaces 1.1.1

+0

Ich habe versucht, Ihre Code-Schnipsel in mein eigenes Projekt zu kopieren. Leider ist die Bean-Klasse unvollständig und benötigt JodaDateTime. Das macht es anderen schwer, das Problem zu verstehen und Ihnen zu helfen. –

Antwort

1

ich meinen Fehler erkannt war in der Art, wie ich die tabview/Zeitplan aktualisiert hatte, anstatt zwei Formulare und die Schaltfläche "submit" button Targeting der zweiten Formular-ID, stattdessen hatte ich die Übermittlungsschaltfläche aktualisieren die t abview selbst.

+0

Warum hilft die Kombination der beiden Formen zu einer einzigen Form? Brauchst du wirklich beide Änderungen? –

+0

Nein, das weiß ich, ich denke, es könnte entfernt werden. – landocalrissian