Model 维克特:如何;通行证;包装表单组件的AJAX行为?

Model 维克特:如何;通行证;包装表单组件的AJAX行为?,model,wicket,word-wrap,Model,Wicket,Word Wrap,如果我将输入包装在div中(与其他内容一起), 如何将添加到包装器中的beavior传递给该输入 示例: 组件HTML类似于.. 然后我想添加它,比如add(newmycomponent(“foo”,model”).add(newAjaxEventBehavior(“onupdate”){…}(但这不起作用,因为只有FormComponent可以接收(AjaxEventBehavior`s) 我假设我可以将此行为对象从包装器移动到输入,但不知道在哪里-是否有一些“构造后”侦听器? 还是应该完全不

如果我将输入包装在div中(与其他内容一起),
如何将添加到包装器中的beavior传递给该输入

示例:
组件HTML类似于
..

然后我想添加它,比如
add(newmycomponent(“foo”,model”).add(newAjaxEventBehavior(“onupdate”){…}
(但这不起作用,因为只有
FormComponent
可以接收(AjaxEventBehavior`s)

我假设我可以将此行为对象从包装器移动到输入,但不知道在哪里-是否有一些“构造后”侦听器?
还是应该完全不同,比如将行为作为参数传递?

保持上述状态的原因是使其对组件的用户透明。

您可以覆盖包装组件的
MarkupContainer\add(Behavior…behaviors)
方法。这当然意味着包装组件永远不会接收任何行为:

public class MyWrappingComponent extends Panel {
    private TextField<?> field;

    // Constructors and stuff..

    @Override
    public Component add(Behavior... behaviors) {
        field.add(behaviors);
        return this;
    }
}
public abstract class WrapperComponent extends Panel 
{
       public WrapperComponent(String id)
       {
              super(id);

              add(getInnerComponent("whateveridyouwant"));

              //Other wrapper stuff
       } 

      public abstract Component getInnerComponent(String id);         
}
然后像这样使用它:

 add(new MyWrappingBorder("border")
     .add(new TextField<String>("input").add(/* the behaviors */)));

在包装器中包含一个返回组件的抽象方法

public abstract class WrapperComponent extends Panel 
{
       public WrapperComponent(String id)
       {
              super(id);

              add(getInnerComponent("whateveridyouwant"));

              //Other wrapper stuff
       } 

      public abstract Component getInnerComponent(String id);         
}
然后调用WrapperComponent将强制您重写getInnerComponent方法

WrapperComponent wrapperComponent = new WrapperComponent("wrapperComponent")
{
     @Override
     public Component getInnerComponent(String id)
     {
          TextField textfield = new TextField(id);
          textField.add(behavior);
          return textfield; 
     }  

} 
这种方式允许您在实际决定使用WrapperComponent时定义所需的innerComponent和行为。它提供了对innerComponent的更多控制

希望这对你有所帮助

public abstract class WrapperComponent extends Panel 
{
       public WrapperComponent(String id)
       {
              super(id);

              add(getInnerComponent("whateveridyouwant"));

              //Other wrapper stuff
       } 

      public abstract Component getInnerComponent(String id);         
}
WrapperComponent wrapperComponent = new WrapperComponent("wrapperComponent")
{
     @Override
     public Component getInnerComponent(String id)
     {
          TextField textfield = new TextField(id);
          textField.add(behavior);
          return textfield; 
     }  

}