2012-03-12 2 views
5

Я пытаюсь реализовать навигацию по методу Breadcrumb на WebPage, которая обменивает контент Panel через ajax.Wicket Label не обновляется/остается невидимым

Он заканчивает тем, как это: 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); 
    } 
} 

The Home и Page Label легко. Для Panel необходимо обновлять каждый раз, когда я обновляю содержимое PanelWebPage. Я был уверен, что линия target.add(breadCrumbContainer); собирается это сделать. Однако он пуст. Ярлык ничего не показывает.

Я надеялся найти ответ - что, вероятно, очевидно - при написании вопроса, но он все еще ускользает от меня, поэтому я надеюсь, что кто-то здесь увидит мою ошибку.

+2

Интересно, почему бы не использовать компоненты калитки. Посмотрите пример на странице wicketstuff: http://wicketstuff.org/wicket/breadcrumb/ – magomi

+0

Это хорошая идея, я рассмотрю ее. Однако я все еще удивляюсь, почему ярлык не отображается? – Yashima

ответ

10

При игре с видимостью компонента через Ajax необходимо использовать setOutputMarkupPlaceholderTag(true), в дополнение к setOutputMarkupId(true) . Обратите внимание, что setOutputMarkupPlaceholderTag(true) автоматически укажет setOutputMarkupId(true).

Причины, по которым этот компонент обновляется через Ajax (добавление его к AjaxRequestTarget), Wicket возвращает обновленную разметку в ответе Ajax, так что он будет заменен через JS-DOM API через Ajax метод обратного вызова. Таким образом, для функции JS, которая заменит полученную разметку на работу, необходимо иметь ссылку на заменяемый узел DOM (атрибут HTML id). Вот почему нужен setOutputMarkupId(true).

При изменении видимости, если компонент невидим, Wicket не будет генерировать разметку для компонента, что отлично, но имеет недостаток. Если невидимый компонент окажется видимым в следующем ajax-запросе, его разметка будет эффективно возвращена в ответе Ajax. Но поскольку компонент не был виден, он даже не будет существовать в исходной разметке, и будет невозможно заменить узел DOM во время обратного вызова. Именно здесь вступает в действие метод setOutputMarkupPlaceholderTag(true), обертывающий , возможно, не видный компонент в теге-заполнителе (то есть a <div>), который всегда будет отображаться с соответствующим атрибутом HTML id.

+0

Это звучит очень интересно, я буду проверять это, thx – Yashima

+0

Если это действительно так, вы должны получить ошибку javascript во время выполнения метода обратного вызова в 'document.getElementById (id)' из-за ' id' inness в DOM. –

+0

Xavi López является правильным, но вам не нужно устанавливать setOutputMarkupPlaceholderTag (true) в дополнение к setOutputMarkupId (true). Простого первого достаточно, так как оно также установит второе значение true. –

Смежные вопросы