更新多次使用的标签

Update a label which used multiple times

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


    To reproduce this issue:
    1. Add an label on your page (java part):
    private final Label label;
    ..
    label = new Label("yourLabel", "Your Text");
    label.setOutputMarkupId(true);
    add(label);
    ...
    1. Add your label multiple time (for e.g. 4 times) in your page (html part):
    ...
    <span wicket:id="yourLabel"/>
    <span wicket:id="yourLabel"/>
    <span wicket:id="yourLabel"/>
    <span wicket:id="yourLabel"/>
    ...
    2. Add event handler for e.g. the ajax event is UpdateEvent in your page (java part)
    ...
        @Override
        public void onEvent(IEventevent) {
            if (event.getPayload() instanceof UpdateEvent) {
              //update your label
              label.setDefaultModelObject("new Text");
              target.add(label);

            }
        }

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

问题的根源在于 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 的子类来进一步封装内容。