我有一个标签,在我的页面中使用了很多次。 它工作正常,直到我尝试更新每个ajax标签。 结果:仅更新第一个标签。 这是一个已知的问题吗? 我不确定,因为我无法打开JIRA页面: https ://issues.apache.org/jira/browse/wicket(所有时间都可以获得throbber)。 我正在使用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个不同的标签实例和相同的文本内容。
I have a label which is used mutiple times in my page. It works fine, until I try to update the label per ajax. Result: only the first label gets updated. Is it a known issue? I'm not sure, since I can't open the JIRA page: https://issues.apache.org/jira/browse/wicket (Get throbber all time). I'm using wicket version 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); } }=> only the first label gets updated. I have a workaround for this by adding 4 different instances of label with the same text content.
最满意答案
问题的根源是Wicket组件不应该多次使用 - 组件代表页面上的单个项目。 添加四个不同的 Label对象(您的解决方法)是正确的。
如果四个标签始终具有相同的内容,但该内容有时会发生变化,则可以通过让四个标签共享一个可写字符串模型来明确这一点。 这是一些伪代码:
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); } }或者,您可以通过创建Label的子类来进一步封装内容,该子类实现onEvent方法本身并调整其自己的文本。
The root of the problem is that Wicket components are not supposed to be used multiple times - a Component represents an individual item on the page. Adding four different Label objects (your workaround) is correct.
If the four labels will always have the same content, but that content sometimes changes, you can make this clear by having the four Labels share a single writable string Model. Here's some pseudocode:
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); } }Alternatively, you could encapsulate things even further by making a subclass of Label that implements the onEvent method itself and adjusts its own text.
更多推荐
发布评论