2017-07-06 64 views
0

我有一個模態類,當這種模式打開時,它顯示一個面板問用戶是否希望繼續操作。如果用戶選擇「是」,則將請求發送到數據庫,這需要一些時間,在此期間,第一個面板應由第二個面板替換(顯示一個微調器)。如果我們不使用第三個面板,這確實會發生。雖然我想用第三個面板替換第二個面板,以便通知用戶操作是否成功(取決於消息對象,是空還是有錯誤消息)。wicket我使用三個面板,但只有一個顯示在一次,當第三個面板添加到代碼第二個從未出現

所以當我使用addNewPanel(panel3,target)時,我從來沒有看到panel2。我在addNewPanel(panel2,target)之後放了一個thread.sleep(5000)指令,即使如此,這個面板並沒有出現,我只獲得了初始和panel3。 如果我不使用panel3,請參閱panel2。

有沒有人有一個想法,爲什麼會發生這種情況?

下面我有莫代爾類

public class DetailsModal2 extends Modal<IModel<UserDomain>>{ 

    @SpringBean 
    private IService service; 
    private BootstrapAjaxLink<String> noButton; 
    private ResponseMessage message; 
    private ProcessingPanel panel2; 
    private AlertPanel panel3; 
    private Panel replacedPanel; 

    public DetailsModal2(String id, IModel<UserDomain> model){ 
     super(id); 

     replacedPanel = new AreYouSure("replacedPanel"); 
     replacedPanel.setOutputMarkupId(true); 
     add(replacedPanel); 

     panel2 = new ProcessingPanel("replacedPanel"); 
     panel3 = new AlertPanel("replacedPanel"); 


     addButton(new BootstrapAjaxLink<String>("button", null, Buttons.Type.Warning, new ResourceModel("details")){ 

      private static final long serialVersionUID = 1L; 


      @Override 
      public void onClick(AjaxRequestTarget target) { 
      // TODO Auto-generated method stub 

       //I was expecting to see this panel 
       addNewPanel(panel2,target); 

       // this puts this button invisible 
       this.setVisible(false); 
       target.add(this); 
       //this changes the label of the No button to Close 
       noButton.setLabel(Model.of("Close")); 
       target.add(noButton); 

       if(!service.retrieveData()) 
       { 

        message = service.addUser("X"); 
        if(message == null){ 
         panel3.updateClassAndText(true); 
         addNewPanel(panel3,target); 
       } 
       else { 
        panel3.updateClassAndText(false); 
        addNewPanel(panel3,target); 
        System.out.println(""+ message.getError()); 
       } 
      }//close if 

      else if(service.retrieveData()) 
      {  
       message = service.removeUser("X"); 
       if(message == null){ 
        panel3.updateClassAndText(true); 
        addNewPanel(panel3,target); 
       } 
       else{ 
        panel3.updateClassAndText(false); 
        addNewPanel(panel3,target); 
        System.out.println(""+ message.getError()); 
       } 
      } 

     else{ 
      System.out.println("It was not possible to access the db"); 
     } 
      } 

     } 
    }); 

     noButton = new BootstrapAjaxLink<String>("button", null, Buttons.Type.Primary){ 
      private static final long serialVersionUID = 1L; 

     @Override 
     public void onClick(AjaxRequestTarget target) { 
      close(target);  
     } 
    }.setLabel(Model.of("No")); 
    addButton(noButton); 

}  
public void addNewPanel(Panel addpanel, AjaxRequestTarget target){ 
    Panel newPanel = null; 
    newPanel = addpanel; 
    newPanel.setOutputMarkupId(true); 
    replacedPanel.replaceWith(newPanel); 
    target.add(newPanel); 
} 
}//close class 

HTML

<wicket:extend>  
    <div><span wicket:id="replacedPanel"> </span></div> 
</wicket:extend> 
+1

這是因爲http獲得工作的方式而發生的。客戶端向服務器發送請求,服務器迴應響應。當您單擊AjaxLink時,瀏覽器向您的服務器發送請求,並在發送響應之前執行整個onclick方法。你只有在onClick方法完全執行後才能得到響應,所以你不能添加「\t中間結果」面板,這些面板在執行onClick方法的過程中顯示,然後被替換。 –

+0

至於一個可能的解決方案,你可以檢查出Wicket氛圍框架實現,它提供了一種從服務器向客戶端發送推送請求的方法:http://examples7x.wicket.apache.org/atmosphere/。 –

回答

0

檢票氣氛從檢票口8過時,將不再被支持的代碼,所以不使用它..

相關問題