Wicket复合行为

时间:2014-10-30 17:52:58

标签: wicket

我创建了一个复合行为 - 基本上是两个AjaxFormComponentUpdatingBehaviors(onBlur和onKeyUp)。它可以在这里找到:http://tny.cz/0ff0ead2

当渲染已添加此行为的组件时,我得到一个异常,指出“[行为_未在此组件中注册”]。从行为blur.onComponentTag()中调用onComponentTag()方法时会发生异常。

有谁知道为什么会这样?我应该提一下,我正在使用Wicket 1.4.21。

谢谢,

A

2 个答案:

答案 0 :(得分:2)

异常来自RequestCycle#urlFor():

public final CharSequence urlFor(final Component component, final IBehavior behaviour,
    final RequestListenerInterface listener)
{
    int index = component.getBehaviorsRawList().indexOf(behaviour);
    if (index == -1)
    {
        throw new IllegalArgumentException("Behavior " + this +
            " was not registered with this component: " + component.toString());
    }

正如Michael已经评论过的那样,你的包装行为必须添加到组件中,只是调用#bind()是不够的。

答案 1 :(得分:1)

在您的复合行为的#bind()方法中,您为#bind()blur调用了另一种keyUp方法,但正如@Sven已经提到的那样,调用此方法方法不足以做到这一点,因为它为component创建了behaviors的链接,但component仍然不了解它们。

当您致电component.add(behaviors)时,每个行为都会内部调用#bind()个方法。这就是你真正需要的。


所以,只需替换:

blur.bind(component);
keyUp.bind(component);

通过以下方式:

component.add (blur, keyUp);