Wicket Label не обновляется / остается невидимым - PullRequest
5 голосов
/ 12 марта 2012

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

В конечном итоге это выглядит так: 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 просты. Один для Panel нужно обновлять каждый раз, когда я обновляю содержимое Panel WebPage. Я был уверен, что линия target.add(breadCrumbContainer); собирается это сделать. Однако это пусто. Метка ничего не показывает.

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

1 Ответ

10 голосов
/ 12 марта 2012

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

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

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

...