2

プロパティとして列挙型と文字列を持つ単純なリクエストスコープのエンティティ/pojoがあります。

public Enum Type
{
    None,
    Email,
    Fax;
}

@ManagedBean(name = "testEntity")
@RequestScoped
public class TestEntity
{
    private Type type; //Default = None
    private String address;

    //getter and setter
}

この列挙型には、電子メールアドレスと関連アドレスを識別するフィールド「Email」があります。
JSFで、SelectOneMenuで現在選択されているタイプに関するアドレスInputTextフィールドのバリデーターを有効/無効にします。

<h:form id="formId">
    <p:selectOneMenu id="type" value="#{testEntity.type}>
        <p:ajax event="change" update=":formId:address"/>
        <f:selectItem itemLabel="E-mail" itemValue="Email"/>
        <f:selectItem itemLabel="Fax" itemValue="Fax"/>
    </p:selectOneMenu>
    <p:inputText id="address" value="#{testEntity.address}">
        <f:validator validatorId="emailValidator" disabled="#{testEntity.type != 'Email'}"/>
    </p:inputText>
    <!-- button to call bean method with testEntity as param -->
</h:form>

バリデーターがアクティブになることはありませんが、他のフィールドで値の変更を確認できるため、ajax呼び出しは機能しています。

4

2 に答える 2

2

残念ながらそれは不可能です。タグは<f:xxx>タグハンドラー(UIコンポーネントではない)であり、ビューのレンダリング時間ではなく、ビューのビルド時間中に実行されます。したがって、ビューの構築中に無効にされた場合、ビューが再作成されるまで(たとえば、新しいリクエストまたはnull以外のナビゲーションによって)常に無効になります。

type属性に基づいて目的のバリデーターにさらに委任する「グローバル」バリデーターが必要です。

例えば

<p:inputText ... validator="#{testEntity.validateAddress}" />

public void validateAddress(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if (type == Email) {
        context.getApplication().createValidator("emailValidator").validate(context, component, value);
    }
}

Update OmniFacesは最近、<o:validator>この問題を次のように正確に解決する新しいタグを追加しました。

<o:validator validatorId="emailValidator" disabled="#{testEntity.type != 'Email'}"/>

こちらのショーケースの例をご覧ください

于 2012-05-20T23:35:00.970 に答える
0

たぶん誰かがBalusCの助けのおかげで私がそれをどのように解決したかに興味を持っています。

タイプコンポーネントclientIdをカスタムコンバーターに渡します。

<f:attribute name="typeComponentId" value=":formId:type"/>

バリデーター:

public class TestEntity implements Validator
{
    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
    { 
        final String typeComponentId = (String)component.getAttributes().get("typeComponentId");

        final UIInput compType = (UIInput)context.getViewRoot().findComponent(typeComponentId);

        if(compType != null)
        {
            final Type type = (Type)compType.getValue();

            if(type == Type.Email)
                new EmailValidator().validate(context, component, value);
        }
    }
}

編集:

p:datatableなどのui:repeatコンポーネント内で機能していません。

于 2012-05-21T22:38:28.363 に答える