2011-12-09 90 views
4

我有一個簡單的,神祕的問題與標籤和使用ajax來顯示它。檢票標籤+ Ajax不工作

public class ChecklistTemplateForm extends Form{ 
    private static final long serialVersionUID = 1L; 
    private Label cantSaveLabel; 
    public ChecklistTemplateForm(String id) { 
     super(id); 
     cantSaveLabel = new Label("cantSaveLabel", "Name is not unique, enter another name and try saving again."); 
     cantSaveLabel.setVisible(false); 
     cantSaveLabel.setOutputMarkupId(true); 
     add(cantSaveLabel); 
     add(new AjaxButton("saveButton") { 
      private static final long serialVersionUID = 1L; 
      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
       target.addComponent(cantSaveLabel); 
       //here i do some stuff to decide if canSave is true or false 
       if (canSave){ 
        setResponsePage(AdminCheckListPage.class); 
       } 
       else if (!canSave){ 
        cantSaveLabel.setVisible(true); 
        System.out.println(canSave); 
       } 
      } 
     }); 
    } 

} 

有趣的是,是canSave是假的,是System.out.print的工作,但從未cansavelabel變得可見。我錯過了什麼?

回答

2

您無法通過Ajax更新標籤,因爲它不在呈現的頁面中。

cantSaveLabel.setVisible(false); 

使其使標籤不在HTML中。您需要將Label與另一個組件(WebMarkupContainer)包圍起來,並調用setOutputMarkupId(true),並將此容器添加到標籤中的AjaxRequestTarget。

+0

感謝您的幫助。我不知道這種行爲。儘管我嘗試使用webmarkupcontainer但沒有成功。在我的代碼中可能會有一些其他錯誤,從而阻止它的工作。此外,我現在意識到,由於我將使用此面板編輯對象以及創建新對象,因此要求所有對象的唯一名稱不是最聰明的想法。 – fred

+0

@fred你可以用WebMarkupContainer發佈一些代碼嗎?或者是因爲你不再需要這種行爲而解決了? – bert

+0

對不起,晚回答。是的,不幸的是,我將這個包裝稱爲不再需要的功能。我很欣賞你的意見,我很抱歉,我不能給你一個更詳細的例子。 – fred

13

您必須告訴wicket它應爲您使用佔位符標籤,因爲它無法更新標記中不存在的組件。

cantSaveLabel.setOutputMarkupId(true); 
cantSaveLabel.setOutputMarkupPlaceholderTag(true); 
+0

感謝您的解決方案。我想知道爲什麼Wicket在啓用_OUTPUT_MARKUP_ID時不會自動啓用FLAG_PLACEHOLDER? – ejboy

+0

我認爲這個想法是儘可能讓HTML代碼儘可能簡單明瞭。通過默認啓用它,它可以在HTML中導致許多不必要的標籤。一旦你知道它就不是什麼大事;; – Till

+2

'setOutputMarkupPlaceholderTag()'調用'setOutputMarkupId()',所以你不需要同時調用它們。 – idontevenseethecode