2015-08-28 49 views
0

的HTML文件,该文件是这样的:Wicket:我可以在初始化java组件之前创建标记吗?

<wicket:panel> 
    <form wicket:id="adminUIForm"> 
     <table wicket:id="datatable" class="datatable"></table> 
     <div wicket:id="institutTablePanel"></div> 
    </form> 
</wicket:panel> 

但在我的Java代码我只想实例化组件institutTablePanel,在数据表中的行被点击时,因为构造函数是这样的:

target.add(new InstitutTablePanel("institutLabelPabel", selectedContact)); 

而且selectedContact不能为空。 有没有这样做的可能性没有得到一个错误,它无法在我的JavaCode中找到组件?

编辑: 这可能是有益的

@Override 
protected Item<Kontakt> newRowItem(final String id, final int index, 
    final IModel<Kontakt> model) { 
     Item<Kontakt> rowItem = new Item<Kontakt>(id, index, model); 
     rowItem.add(new AjaxEventBehavior("onclick") { 

     private static final long serialVersionUID = 1L; 

     @Override 
     protected void onEvent(AjaxRequestTarget target) { 
      selectedKontakt = model.getObject(); 
      target.add(new InstitutTablePanel("institutTablePanel", selectedKontakt)); 
     } 
    }); 
    return rowItem; 
} 

回答

2

创建一个空的WebMarkupContainer这是一个空白的div并将其添加到您的页面/父组件。接下来,onClick,使用addOrReplace并用InstitutTablePanel替换WebMarkupContainer。这两个WebMarkupContainerInstitutTablePanel应该有相同的wicket:id

+0

这是推荐的方法! –

+0

Jup,那工作完美:) –

1

你在你的Ajax调用瞄准现有的组件,因此,我建议在页面初始化初始化InstitutTablePanel与模型作为面板模型。在没有包装模型的情况下传递模型对象在检票口中是不鼓励的,并且导致不必要的问题。

当模型对象为空或空时,您可以将InstitutTablePanel更改为空。另外,Wicket是围绕着将模型传递给组件而建立的,而不是简单的对象,这些对象一开始可能看起来不需要,但是当复杂度增加时,模式会防止许多错误和错误。

编辑:不要忘了在添加的面板上使用setoutputmarkupid(true)。

+0

但类似: InstitutTablePanel面板=新面板(“institutTablePanel”); 由于Panel是抽象的,因此无法工作。反过来,我面临同样的问题... –

+0

你必须先创建一个InstitutTablePanel扩展面板。 – thg

+0

InstitutTablePanel确实延伸面板 –

相关问题