0

我有一个在我的页面中多次使用的标签。它工作正常,直到我尝试更新每个 ajax 的标签。结果:只有第一个标签被更新。这是一个已知问题吗?我不确定,因为我无法打开 JIRA 页面:https ://issues.apache.org/jira/browse/wicket(始终获取 throbber)。我正在使用 wicket 版本 7.3.0

    要重现此问题:
    1.在您的页面上添加标签(java部分):
    私有最终标签标签;
    ..
    label = new Label("yourLabel", "Your Text");
    label.setOutputMarkupId(true);
    添加(标签);
    ...
    1. 在页面(html 部分)中多次添加标签(例如 4 次):
    ...
    <span wicket:id="yourLabel"/>
    <span wicket:id="yourLabel"/>
    <span wicket:id="yourLabel"/>
    <span wicket:id="yourLabel"/>
    ...
    2.在你的页面中添加事件处理程序,例如ajax事件是UpdateEvent(java部分)
    ...
        @覆盖
        公共无效事件(IEventevent){
            if (event.getPayload() instanceof UpdateEvent) {
              //更新你的标签
              label.setDefaultModelObject("新文本");
              目标.添加(标签);

            }
        }

=> 只有第一个标签被更新。我通过添加具有相同文本内容的 4 个不同标签实例来解决此问题。

4

1 回答 1

1

问题的根源在于 Wicket 组件不应该被多次使用 - 一个组件代表页面上的单个项目。添加四个不同的标签对象(您的解决方法)是正确的。

如果四个标签始终具有相同的内容,但该内容有时会发生变化,您可以通过让四个标签共享一个可写字符串模型来明确这一点。这是一些伪代码:

IModel<String> labelModel = new Model<String>("Your Text");

label1 = new Label("label1", labelModel);
label1.setOutputMarkupId(true);
add(label1);

label2 = new Label("label2", labelModel);
label2.setOutputMarkupId(true);
add(label2);

...

@Override
public void onEvent(IEventevent) {
    if (event.getPayload() instanceof UpdateEvent) {
      //update your label
      labelModel.setObject("new Text");
      target.add(label1);
      target.add(label2);
    }
}

或者,您可以通过创建实现 onEvent 方法本身并调整其自己的文本的 Label 的子类来进一步封装事物。

于 2016-08-30T20:39:11.057 回答