0

我遵循这个例子,但我想改变它。当您单击某行上的任何位置时,我想选择行,而不仅仅是某个值,所以我添加了AjaxEventBehavior. 问题是选择了播放器,但行的颜色仍然相同。怎么了 ?

listItem.add(new AjaxEventBehavior("onclick") {

    private static final long serialVersionUID = 1L;

    @Override
    protected void onEvent(final AjaxRequestTarget target) {
        selectedPlayer = player;
        HighlitableDataItem<Player> hitem = (HighlitableDataItem<Player>) listItem;
        hitem.toggleHighlite();
    }
});
4

2 回答 2

1

正如@jordeu 在他的评论中已经指出的那样,您必须hitem添加AjaxRequestTarget

target.addComponent(hitem);

将组件添加到AjaxRequestTarget将向 XML 响应发送回组件的标记,以及您可能在服务器端对其进行的所有更改,以及更新的模型(这对动态模型很有用)。请记住调用setOutputMarkupId(true)要添加到请求目标的组件。Wicket 需要标记 id(HTMLid属性)来了解 DOM 中的哪个位置来替换 XML 响应中发送的标记。或者,用javadoc的话来说:

应通过 AjaxRequestTarget#addComponent(Component) 方法将需要更新标记的组件添加到此目标。当处理目标时,它的主体将被渲染并添加到信封中,并在收到 ajax 响应时在客户端刷新。

重要的是,需要更新其标记的组件在生成的标记中包含一个 id 属性,该属性等于从 Component#getMarkupId() 检索到的值。这可以通过在 html 模板中设置 id 属性或使用属性修饰符来完成,该修饰符将带有值 Component#getMarkupId() 的属性添加到标签(例如 MarkupIdSetter )

另外,考虑到使用 Ajax 来设置元素的样式可能有点矫枉过正。如果不需要服务器交互,您可以考虑使用 Javascript/jQuery(如果可用)为元素客户端设置样式。

于 2012-12-13T08:59:33.817 回答
0

最有效的方法是将 JavaScript 渲染到您的表中。这样做可以避免到服务器的往返,这在这个简单的仅用于样式的情况下将是多余的。

您可以通过覆盖 DataTable#newRowItem 并将 AttributeAppender 添加到 RowItem 来实现它:

//override this method of the DataTable class
@Override
protected Item<T> newRowItem(String id, int index, final IModel<T> model) {

    Item<T> rowItem = new Item<T>(id, index, model);
    item.add(new AttributeAppender("onclick", "$(this).addClass('selected').siblings().removeClass('selected')",
            " "));

    return rowItem;

}

在 CSS 样式表中的“选定”选择器下定义您的选择样式。

于 2015-07-15T09:41:31.363 回答