1

入力が div で (他のものと一緒に) ラップされている場合
、ラッパーに追加されたビーバーをその入力に渡すにはどうすればよいですか?

例:
コンポーネント HTML は次のようになります。<div> <img> <input> ...
次に、次のように追加したいと思います (ただし、 (AjaxEventBehavior`s) しか受信できadd( new MyComponent("foo", model).add( new AjaxEventBehavior("onupdate"){ ... }ないため、これは機能しません)。FormComponent

この動作オブジェクトをラッパーから入力に移動できると思いますが、どこにあるのかわかりません-「構築後」のリスナーはありますか?
または、動作をパラメーターとして渡すなど、まったく別の方法で行う必要がありますか?
上記のようにしておく理由は、コンポーネントのユーザーに対して透過的にするためです。

4

2 に答える 2

1

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;
    }
}

1 つのオプションは、ラッピング コンポーネントを に分離することですBorder。これは、コンポーネントをコンテンツで囲むために使用できます。ただし、これにより、ラッピング要素の「透明度」が低下します。( Javadoc ページの例を参照してください)。

public class MyWrappingBorder extends Border {
    public MyWrappingBorder(String id) {
        // add the <img />
        // add the <div />
    }
    ...
 }

 // The markup
 <wicket:border>
     <div>
        <img />
        <wicket:body /> <!-- Will be replaced with the added content -->
     </div>
 </wicket:border>

次に、次のように使用します。

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

このようなマークアップで

 <div wicket:id="border">
     <input type="text" wicket:id="input" />
 </div>

このBorderアプローチにより、「TextField? 成分。たとえば、ドロップダウンを追加する場合:

 add(new MyWrappingBorder("border")
     .add(new DropDownChoice<String>("input", listOfChoices)));    
于 2013-01-14T06:41:56.547 に答える
1

コンポーネントを返すラッパーに抽象メソッドを含めます。

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 でできることをより詳細に制御できます。

これがお役に立てば幸いです。

于 2013-01-14T09:08:03.780 に答える