更新多次使用的标签
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 的子类来进一步封装内容。
我有一个标签在我的页面中使用了多次。它工作正常,直到我尝试根据 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 的子类来进一步封装内容。