Apache калитка: Componenet.replaceWith (компонент) из Linktree.onNodeSelected () - PullRequest
0 голосов
/ 20 июля 2011

У меня есть дерево ссылок для навигации по данным, которое должно заменить компонент в другом div.

Для этого в дереве у меня есть Treetatelistener, реализующий

public void nodeSelected(Object node) {
    log.debug("nodeSelected: " + node+ " class: " + node.getClass());
            Component content = new Label("content");
            content.replaceWith(new Label("content", "Hello World"));
        }
    }
}

Все, что я получаю, это сообщение:

"Этот метод может быть вызван только для компонента, который уже был добавлено к его родителю. "

Метка с идентификатором "content" добавляется на страницу при инициализации, поэтому она там и раньше. Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Вы создаете новый родительский компонент каждый раз, когда вызывается ваш слушатель treenode, без добавления метки «content». Я хотел бы попробовать что-то вроде этого -

public MyPage extends WebPage {
  private Component parent = new WebMarkupContainer("parent");

  public WebPage() {
    parent.add(new Label("content", "hi");
  }
  ...
  public void nodeSelected(Object node) {
    log.debug("nodeSelected: " + node+ " class: " + node.getClass());
        parent.replaceWith(new Label("content", "Hello World"));
    }
  }
}
0 голосов
/ 22 июля 2011

У меня всегда есть проблемы с простым вызовом Component.replaceWith (). Так как я делаю это с AJAX, мне всегда нужно вызывать target.add ().

Мое решение на данный момент состоит в том, чтобы класс MyTree расширял LinkTree и в этом классе переопределял newNodeComponent ().

Поскольку в моем приложении все происходит с IndexPage.class, и там я просто заменяю компоненты, я добавил метод handleSelection () в IndexPage.Class (расширяет BasePage, расширяет веб-страницу). Там я решаю, основываясь на выбранном объекте nodeObject, как заменить компонент в IndexPage

Public Class MyTree extends Linktree{
  protected Component newNodeComponent(String id, IModel<Object> model) {
  @Override
        protected void onNodeLinkClicked(Object node, BaseTree tree, AjaxRequestTarget target) {
            super.onNodeLinkClicked(node, tree, target);
            ((IndexPage)getPage()).handleSelection(target, (TreeNode)node);
        }

        @Override
        protected ResourceReference getResourceFolderOpen(Object node) {
            return getResourceForNode(node);
        }

        @Override
        protected ResourceReference getResourceFolderClosed(Object node) {
            return getResourceForNode(node);
        }

        @Override
        protected ResourceReference getResourceItemLeaf(Object node) {
            return super.getResourceItemLeaf(node);
        }

        @Override
        protected ResourceReference getImageResourceReference(BaseTree tree, Object node) {
            return getResourceForNode(node);
        }
  } 
}

Надеюсь, это объяснимо, иначе: нужны вопросы или комментарии!

...