Wicket:从IBehavior :: onComponentTag更改组件主体

时间:2010-10-18 21:02:35

标签: java html wicket

我正在实现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>

2 个答案:

答案 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的建议也适用于所有人。如果不需要,请不要弄乱模型。