複数項目への Validator
Validator の source プロパティが一つしか存在しないので複数項目をチェックして判断するバリデーションはどうするのかと思ったのですが Model(おそらく、他のデータバインディングも可能)を利用して複数の値を渡す事ができる模様。
二つの日付(開始日と終了日)を比較して、終了が開始より先だったらエラーにするサンプル。
<?xml version="1.0" ?> <!-- validators/MainNameValidator.mxml --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:MyComp="myValidators.*"> <mx:Script> <![CDATA[ import mx.validators.Validator; import mx.events.ValidationResultEvent; import mx.controls.Alert; private function validationCheck():void { // せっかくなので、他のバリデータもあわせて使える形に var resultArray:Array = Validator.validateAll([dateVal]); if(resultArray.length == 0) { trace("正しいデータです"); } else { var errorMessageArray:Array = new Array(); for each(var error:ValidationResultEvent in resultArray) { errorMessageArray.push(error.message); } Alert.show(errorMessageArray.join("\n\n")); } } ]]> </mx:Script> <mx:Model id="term"> <date> <dateSet> <start>{startOn.selectedDate.toDateString()}</start> <finish>{finishOn.selectedDate.toDateString()}</finish> </dateSet> </date> </mx:Model> <mx:DateField id="startOn" /> <mx:DateField id="finishOn" /> <MyComp:DateValidator id="dateVal" source="{term}" property="dateSet"/> <mx:Button label="Validate" click="validationCheck();"/> </mx:Application>
/* DateValidator.as */ package myValidators { import mx.validators.Validator; import mx.validators.ValidationResult; public class DateValidator extends Validator { // doValidation() の戻り値の Array を定義する private var results:Array; public function DateValidator () { super(); } override protected function doValidation(value:Object):Array { var sDate:Date = new Date(value.start); var fDate:Date = new Date(value.finish); // 結果の Array をクリアする results = []; // 基本クラス doValidation() を呼び出す results = super.doValidation(value); // エラーがあるかどうかを返す if (results.length > 0) return results; // 日付のフィールドをチェックする if (sDate > fDate) { results.push(new ValidationResult(true, "start", "youCannotBackToTheFuture", "終了日が開始日より前に設定されています。")); } return results; } } }
ValidationResult に指定する引数は、前から順に『エラーが発生したか(通常 true)』、『検証したオブジェクトのサブフィールドの名前』、『エラーの識別コード(適当で大丈夫)』、『エラーメッセージ』を意味します。