更新多次使用的标签

时间:2016-08-30 13:12:07

标签: wicket wicket-7

我的标签在我的页面中使用了很多次。它工作正常,直到我尝试更新每个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);

            }
        }

=&GT;只有第一个标签得到更新。我有一个解决方法,通过添加4个不同的标签实例和相同的文本内容。

1 个答案:

答案 0 :(得分: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子类并调整其自己的文本来进一步封装内容。