2012-03-12 35 views
5

我試圖通過WebPage實現Breadcrumb導航,它通過ajax交換內容Panel檢票標籤未更新/仍然不可見

它結束了看起來像這樣: Home >> Page >> Panel

這裏是我的網頁代碼:

public MyPage() { 
    super(); 
    contentContainer = new WebMarkupContainer("contentContainer"); 
    contentContainer.setOutputMarkupId(true); 
    add(contentContainer); 
    contentContainer.add(content = createContentPanel()); 

    breadCrumbContainer = new WebMarkupContainer("breadcrumbContainer"); 
    breadCrumbContainer.setOutputMarkupId(true); 
    add(breadCrumbContainer); 

    final AjaxLink panelLink = new AjaxLink("panelLink") { 

     @Override 
     public void onClick(final AjaxRequestTarget target) { 
      replaceContentPanel(getOverviewPanel(), target); 
     } 

     @Override 
     public boolean isVisible() { 
      return !(content instanceof OverviewPanel); 
     } 
    }; 
    breadCrumbContainer.add(panelLink); 
    panelLink.add(new Label("panelLabel", new Model<String>() { 
     @Override 
     public String getObject() { 
      //some dynamic content for example: 
      return contentPanel.getClass().getName(); 
     } 
    })); 
} 

public void replaceContentPanel(final Component replacer, final AjaxRequestTarget target) { 
    content.replaceWith(replacer); 
    content = replacer; 
    if (target != null) {   
     target.add(contentContainer); 
     target.add(breadCrumbContainer); 
    } 
} 

的主頁和頁Label容易。每當我更新WebPage的內容Panel時,需要更新面板。我確信target.add(breadCrumbContainer);線路將會這樣做。然而它是空的。標籤什麼也沒有顯示。

我希望找到答案 - 這可能很明顯 - 雖然寫了問題,但它仍然沒有我,所以我希望有人在這裏找到我的錯誤。

+2

我想知道,爲什麼不使用wicket breadcrumb組件。在wicketstuff頁面查看示例:http://wicketstuff.org/wicket/breadcrumb/ – magomi 2012-03-12 12:03:11

+0

這是一個好主意,我會研究它。不過,我仍然想知道爲什麼標籤不顯示? – Yashima 2012-03-12 14:56:57

回答

10

當通過Ajax使用組件的可見性時,除了setOutputMarkupId(true)之外,還需要使用setOutputMarkupPlaceholderTag(true) 。請注意0​​將自動暗示 setOutputMarkupId(true)

這樣做的原因是,當組件通過Ajax刷新(將其添加到AjaxRequestTarget)時,Wicket會在Ajax響應中返回刷新的標記,以便它將通過Ajax通過JS-DOM API進行替換回調方法。因此,對於將取代接收到的標記的JS函數來說,有必要引用DOM節點來替換(HTML id屬性)。這就是爲什麼需要setOutputMarkupId(true)

更改可見性時,如果組件不可見,則Wicket不會爲組件生成任何標記,這很好,但有一個缺點。如果一個不可見的組件在後面的ajax請求中可見,則其標記將在Ajax響應中有效返回。但是,由於該組件不可見,它甚至不會存在於原始標記中,並且在回調時不可能替換DOM節點。這就是setOutputMarkupPlaceholderTag(true)方法開始實施的方式,將可能不可見的組件包裝在佔位符標記(即<div>)中,該標記始終使用正確的HTML id屬性進行呈現。

+0

這聽起來很有趣,我會檢查,thx – Yashima 2012-03-12 18:00:31

+0

如果這真的是問題,你應該在執行回調方法期間得到一個javascript錯誤,在'document.getElementById(id)'中由於' ID在DOM中不存在。 – 2012-03-12 18:58:38

+0

XaviLópez是正確的,但除了setOutputMarkupId(true)之外,您不需要設置setOutputMarkupPlaceholderTag(true)。只是第一個就足夠了,因爲它將第二個也設置爲真。 – 2012-03-12 20:32:57