如何动态地将超链接(BookmarkablePageLink)添加到呈现为锚点的DefaultDataTable

时间:2013-05-23 22:59:09

标签: apache anchor wicket

我有一个DefaultDataTable以编程方式获取其列。

标记很简单:

        <table wicket:id="dataTable" border="0" cellpadding="1" cellspacing="1" width="90%" />

所有列都是从标签和属性的传递LinkedHashMap中动态生成的:

    for (Entry<String, String> entry : entrySet) {
        final String label = entry.getKey();
        final String attribute = entry.getValue();
        columns.add(new PsPropertyColumn(label, attribute) {

            @Override
            public void populateItem(Item cellItem, String componentId, IModel model)
            {
                final Object modelObject = model.getObject();
                final Object value = PropertyResolver.getValue(attribute, modelObject);
                // Add an edit link
                BookmarkablePageLink link = new ...;
                ...
                cellItem.add(link);
            }
        }
    }

    DefaultDataTable table = new DefaultDataTable("dataTable", columns, dataProvider, MAX_ROWS) {
        ...
    }
    add(table);

正如许多帖子所提到的,它被渲染为具有onclick处理程序而非锚点(&lt; a href =“...”/&gt;)标记的单元格。我想要锚标签有几个原因,其中一个原因是我想添加自己的onclick处理程序而不需要现有的onclick处理程序。

我已经看到了一个普遍接受的解决方案,即在HTML标记的面板中放置一个锚标签,并在Panel子类中添加链接。但是,这并没有给出整个html标记(在表格内),我认为column()标签必须是这个标记的一部分,我认为这与我动态生成列的策略无关(I甚至不知道或关心会有多少人被要求)。有没有办法将动态生成的列渲染为锚标记,而无需在标记中指定多少个?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已经使用嵌套的ListView组件来对布局进行更多控制,如下所示:

HTML:

<table wicket:id="listViewContainer">
    <tr>
        <th wicket:id="columnHeaderListView">
            <span wicket:id="columnHeaderLabel">Header Label</span>
        </th>
    </tr>
    <tr wicket:id="rowListView">
        <td wicket:id="rowColumnListView">
            <a href="#" wicket:id="link">
                <span wicket:id="linkLabel">Link Label</span>
            </a>
        </td>
    </tr>
</table>

爪哇:

WebMarkupContainer listViewContainer = new WebMarkupContainer("listViewContainer");
listViewContainer.setOutputMarkupId(true);
add(listViewContainer);

ListView columnHeaderListView = new ListView("columnHeaderListView", columnHeaderList) {
    @Override
    protected void populateItem(ListItem listItem) {
        ColumnHeader ch = (ColumnHeader) listItem.getModelObject();
        listItem.add(new Label("columnHeaderLabel", new Model(ch.getLabel())));
    }
};
listViewContainer.add(columnHeaderListView);

ListView rowListView = new ListView("rowListView", rowList) {
    @Override
    protected void populateItem(ListItem listItem) {
        Row row = (Row) listItem.getModelObject();
        listItem.add(new ListView("rowColumnListView", getRowColumnList(row)){
            @Override
            protected void populateItem(ListItem li) {
                RowColumn rowColumn = (RowColumn) li.getModelObject();
                Link link = new BookmarkablePageLink("link",...
                li.add(link);
                link.add(new Label("linkLabel", new Model(rowColumn.getLabel())));
            }
        });
    }
}
listViewContainer.add(rowListView);