我正在实现Wicket IBehavior接口,并希望我的行为从onComponentTag方法更改组件的主体(或以某种方式更新模型)。 有没有办法做到这一点?
@Override
public void onComponentTag(final Component component, final ComponentTag tag)
{
String myValue = tag.getAttribute("myAttribute");
// TODO: Based on the value of this attribute, update the body/model of the component
super.onComponentTag(component, tag);
}
编辑:我想从html中获取一个属性,该属性指定元素允许的最大字符数,然后根据需要以编程方式截断元素的主体。
示例:
<span wicket:id="myLabel" maxChars="10">The body of my tag</span>
将替换为:
<span wicket:id="myLabel" maxChars="10">The bod...</span>
答案 0 :(得分:2)
您可以通过从组件中获取模型,从模型中获取对象并在对象上进行所需的任何更改来实现此目的,但onComponentTag
不是更改工作的最佳工作场所模型。
在渲染过程中,在页面可能已部分渲染的位置调用此方法。已经渲染的页面的任何部分都将使用模型的先前状态进行渲染。由于模型可以在组件之间共享,因此生成的页面可能不一致。
如果您正在尝试更改渲染的主体,这是另一个故事,并且在此方法中完成合理的工作。它通常涉及在ComponentTag tag
参数上调用方法。
您尝试通过创建此行为来解决的问题是什么?也许我们可以想出更好的方法。
编辑:
对于在标签上修剪显示的特定情况,只需按照以下方式对Label
组件进行子类化,就可以提供更好的服务:
public class TrimmedLabel extends Label {
private int size;
public TrimmedLabel(String id, int size) {
super(id);
this.size = size;
}
public TrimmedLabel(String id, String label, int size) {
super(id, label);
this.size = size;
}
public TrimmedLabel(String id, IModel model, int size) {
super(id, model);
this.size = size;
}
@Override
protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
String value = getModelObjectAsString();
if (value.length() > size) {
value = value.substring(0, size);
}
replaceComponentTagBody(markupStream, openTag, value);
}
}
答案 1 :(得分:2)
从快速入门http://wicket.apache.org/start/quickstart.html派生出来,我的建议如下:
add(new Label("message", "If you see this message wicket is properly configured and running") {
@Override
protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
String myAttrib = openTag.getAttribute("myAttrib");
replaceComponentTagBody(markupStream, openTag, getDefaultModelObjectAsString().substring(0, Integer.valueOf(myAttrib)));
}
});
不要忘记关注NumberFormat Exceptions。
此外,donroby的建议也适用于所有人。如果不需要,请不要弄乱模型。