1

isVisible() の同じ実装を持ついくつかの異なる wicket コンポーネントを持つことができる方法はありますか?

たとえば、同じ isVisible メソッドを持つ Labels、TextFields、DropdownChoices などがありますが、コードの変更を維持するのが難しいため、それらすべてにカスタム クラスを実装するつもりはありません。

ところで、ページのデザインが原因で、それらを webmarkupcontainer に入れることはできません。

こういうのをみんなに受け継いでほしい。

public class DepositoryFormComponent extends Component
{
public DepositoryFormComponent(String id) {
    super(id);
}

public DepositoryFormComponent(String id, IModel model) {
    super(id, model);
}

public boolean isVisible() {
    return isFormDepositoryType();
}

protected boolean isFormDepositoryType() {
    return getCurrentSelections().getSelectedOwnedAccount().getAssetType() == AssetType.DEPOSITORY;
}

protected CurrentSelections getCurrentSelections() {
    return (CurrentSelections) getSession().getAttribute(CurrentSelections.ATTRIBUTE_NAME);
}

public void onRender(){};

}

4

1 に答える 1

2

いくつかのオプションがあります:

  1. マークアップを制御でき、可視性を制御したいすべてのコンポーネントを 1 つのタグでグループ化できる場合は、<wicket:enclosure>タグを使用して、マークアップ全体の可視性をコンポーネントで制御することができます。これはページのデザインには影響しないことに注意してください。WebMarkupContainer

  2. IBehaviorこれらのコンポーネントに、可視性を計算して を呼び出す をsetVisible()追加できますComponent。今後の呼び出しで の可視性を変更しComponent#setVisibilityAllowed()たくない場合は、呼び出すこともできます。オーバーライドほど正確ではないかもしれませんが、カスタム コンポーネントを作成しないと、オーバーライドを達成する可能性は低いと思います。setVisible()ComponentisVisible

    public class VisiblityControlBehavior extends AbstractBehavior { 
    
        private boolean isComponentVisible() { 
            return isFormDepositoryType();
        } 
    
        protected boolean isFormDepositoryType() {
            return getCurrentSelections().getSelectedOwnedAccount().getAssetType() == AssetType.DEPOSITORY;
        }
    
        protected CurrentSelections getCurrentSelections() {
            return (CurrentSelections) getSession().getAttribute(CurrentSelections.ATTRIBUTE_NAME);
        }
    
        @Override 
        public void bind(Component component) { 
            boolean visible = isComponentVisible(); 
            component.setVisible(visible); 
            component.setVisibilityAllowed(visible); 
        } 
    } 
    
于 2012-09-19T08:07:19.857 に答える