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>
這是因爲http獲得工作的方式而發生的。客戶端向服務器發送請求,服務器迴應響應。當您單擊AjaxLink時,瀏覽器向您的服務器發送請求,並在發送響應之前執行整個onclick方法。你只有在onClick方法完全執行後才能得到響應,所以你不能添加「\t中間結果」面板,這些面板在執行onClick方法的過程中顯示,然後被替換。 –
至於一個可能的解決方案,你可以檢查出Wicket氛圍框架實現,它提供了一種從服務器向客戶端發送推送請求的方法:http://examples7x.wicket.apache.org/atmosphere/。 –