Гибкая условная проверка

Я пытаюсь выполнить проверку трех полей в файле mxml. Два из них обязательны, один нет. Поле почтового индекса, которое я хочу проверить только в том случае, если в него что-то введено. Если оно пустое, я хочу, чтобы кнопка «Отправить» была включена, если два других обязательных поля установлены правильно. Код:

<mx:EmailValidator id="emailValidator" 
                       property="text" source="{ownerName}"
                       valid="emailValidator_validHandler(event)"
                       invalid="emailValidator_validHandler(event)"/>
    <mx:ZipCodeValidator id="zipCodeValidator"
                         property="text" source="{zip}"
                         required="false"
                         valid="zipCodeValidator_validHandler(event)"
                         invalid="zipCodeValidator_validHandler(event)"/>

    <mx:Validator id="roomNameValidator" 
                  property="text" source="{roomName}"
                  valid="roomNameValidator_validHandler(event)"
                  invalid="roomNameValidator_validHandler(event)"/>
        [Bindable]
        private var isRoomNameValid:Boolean;
        [Bindable]
        private var isOwnerValid:Boolean;
        [Bindable]
        private var isZipValid:Boolean;

        protected function emailValidator_validHandler(event:ValidationResultEvent):void
        {
            isOwnerValid = (event.type==ValidationResultEvent.VALID);
        }

        protected function zipCodeValidator_validHandler(event:ValidationResultEvent):void
        {
            isZipValid = (event.type == ValidationResultEvent.VALID);
        }
        protected function roomNameValidator_validHandler(event:ValidationResultEvent):void
        {
            isRoomNameValid = (event.type==ValidationResultEvent.VALID);
        }

Затем я попытался установить свойство enable кнопки отправки:

 enabled = "{isOwnerValid &amp;&amp; isRoomNameValid &amp;&amp zip.text.length>0?isZipValid:true}"

Но это не работает. Я все еще могу отправить неверные данные в поле почтового индекса, даже если поле почтового индекса имеет красную рамку.


person David    schedule 14.09.2012    source источник


Ответы (3)


Это не отвечает на ваш вопрос, но вы можете серьезно подумать об использовании какого-либо типа MVC. Вся эта логика в вашей включенной функции имеет запах кода.

person Black Dynamite    schedule 15.09.2012

РЕДАКТИРОВАТЬ: Мое предыдущее предложение могло привести к бесконечному циклу :-)

Я бы предложил использовать метод изменения текстовых полей для выполнения проверки следующим образом:

protected function changeHandler(event:Event):void
{
    submitButton.enabled = Validator.validateAll(validators.source);
}

<mx:ArrayCollection id="validators">
    <mx:EmailValidator id="emailValidator"
                   property="text" source="{ownerName}" />        
    <mx:ZipCodeValidator id="zipCodeValidator"
                   property="text" source="{zip}"
                   required="false" />
    <mx:Validator id="roomNameValidator" 
                   property="text" source="{roomName}" />
</mx:ArrayCollection>

<mx:Label text="Owner Name:" />
<mx:TextInput id="ownerName" change="changeHandler(event)" />
<mx:Label text="Zip Code:" />
<mx:TextInput id="zip" change="changeHandler(event)" />
<mx:Label text="Room Name:" />
<mx:TextInput id="roomName" change="changeHandler(event)" />
<mx:Button id="submitButton" label="Submit" enabled="false" />
person Trish Rempel    schedule 15.09.2012
comment
Привет, Триш. Спасибо за ответ. Я попробовал код, и он по-прежнему позволяет мне отправлять неверные данные, даже несмотря на то, что вокруг поля с почтовым индексом появляется красный контур. - person David; 17.09.2012

Во-первых, поскольку почтовый индекс не является обязательным, вы должны инициализировать его как true :

[Bindable] var isZipValid:Boolean = true;


Теперь вот решение:

protected function zipCodeValidator_validHandler(event:ValidationResultEvent):void
{
    isZipValid = (zip.text.length == 0) || (event.type == ValidationResultEvent.VALID);
}

а затем в вашей кнопке отправки

enabled = "{isOwnerValid && isRoomNameValid && isZipValid}"

Альтернативным решением может быть: включение самого валидатора только тогда, когда почтовый индекс не пуст, обязательно, вы должны инициализировать его значением true :

<mx:ZipCodeValidator id="zipCodeValidator"
                 property="text" source="{zip}"
                 required="false"
                 valid="zipCodeValidator_validHandler(event)"
                 invalid="zipCodeValidator_validHandler(event)"
                 enabled="{zip.text.length > 0}"/>

[Привязываемый] var isZipValid:Boolean = true;

person Majid Laissi    schedule 15.09.2012
comment
Попробовал этот код - он позволяет мне отправить недопустимый почтовый индекс, даже если отображается сообщение об ошибке. Похоже, мне придется написать собственный класс, который я опубликую здесь в случае успеха. - person David; 17.09.2012