2011-07-20 4 views
0

私は別のdiv内のコンポーネントを置き換えるデータのナビゲーションのためのリンクツリーを持っています。Apache wicket:Linksetree.onNodeSelected()からのComponenet.replaceWith(コンポーネント)

私は

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

を実装treestatelistenerを持っている木で、このために

私が得るすべてがメッセージです:

「この方法は、すでに が追加されているコンポーネント上で呼び出すことができますその親に」

"content"というIDを持つラベルは、initのページに追加されています。その前にあります。何が間違っていますか?

答えて

0

- 私は何を示唆している はこのような何かを試してみることです。私はAJAXでこれをやっているので、常にtarget.add()を呼び出す必要があります。

私の解決策は、クラスMyTreeがLinkTreeを拡張し、そのクラスでnewNodeComponent()をオーバーライドすることです。

私のアプリケーションではすべてIndexPage.classで発生し、コンポーネントを置き換えただけなので、IndexPage.ClassにメソッドhandleSelection()を追加しました(BasePage extends Webページを拡張します)。質問やコメントが欲しかった:そこ私は、私は他に、これはpropperly説明されている願っています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); 
     } 
    } 
} 

にコンポーネントを交換する方法を、クリックされたnodeObjectに基づいて、決定します!

2

'content'ラベルを追加せずに、あなたのtreenodeリスナーが呼び出されるたびに新しい親コンポーネントを作成しています。私はいつもちょうどComponent.replaceWith()を呼び出すことで問題を抱えている

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

Hm。それはどこから選んだの? –

+0

replaceWithを呼び出す行について: "置換コンポーネントは、置換するコンポーネントと同じIDを持つ必要があります" これまでのところ、コンストラクタで初期化する新しいLabelに対してreplaceWith関数を呼び出す必要があります。 また、replaceを呼び出すと、元のラベル= newLabelも同様に行う必要があります。 私はWicket 6.20を使用しています。確かめるために、同じ状況について話しています。 :) – BlondCode

関連する問題