2012-09-14 40 views
0

我想對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); 
     } 

然後我試圖設置提交按鈕的enabled屬性:

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

但它不工作。即使郵政編碼字段顯示紅色邊框,我仍然可以在zip字段中提交錯誤的數據。

回答

0

這並不回答你的問題,但你可能要認真考慮使用某種類型的MVC。啓用函數中的所有邏輯都具有代碼異味。

0

編輯:我以前的建議可能會導致一個無限循環:-)

我會建議使用文本框改變方法如下執行驗證:

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" /> 
+0

嗨特里什。感謝你的回答。我試過這段代碼,即使在郵政編碼框周圍出現紅色輪廓,它仍然可以讓我提交錯誤的數據。 – David

0

首先,郵政編碼不是強制性的,您應該將其初始化爲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}" 

另一種解決辦法是:使作爲驗證本身,只有當拉鍊郵編不是空白的,你應該初始化爲真:

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

[Bindable] var isZipValid:Boolean = true;

+0

嘗試了此代碼 - 即使錯誤消息顯示,它也允許我提交不可接受的郵政編碼。看起來我必須寫一個自定義類,如果成功,我會在這裏發佈。 – David