このサブクラスとして既に実装されているValidatorは
CreditCardValidator, CurrencyValidator, DateValidator, EmailValidator, NumberValidator, PhoneNumberValidator, RegExpValidator, SocialSecurityValidator, StringValidator, ZipCodeValidator があります。
これ以外のValidatorって自作する場合、どう作るんだろう? と思い作成してみました。
今回欲しかったのは、重複チェックのValidator。
複数のObjectを登録できるが、名前は重複させたくない という場合の時に使うためのものです。
- ArrayCollectionの中にAオブジェクトが複数入っている。
- Aオブジェクトには name という属性がある。
- 新規追加する時は、ArrayCollectionの中に同じnameが入っていたらエラー。
- 更新する時には、更新対象オブジェクト以外でチェックする。(excludeの設定)
- 必須入力の項目でもある
という前提だと、
var validator:Validator = new DuplicateValidator(arrayCollection, "name", excludeObject);
validator.source = txtName;
validator.property = "text";
validator.required = true;
ように設定するものになります。
/**
* リストの中に重複がないかチェックする
* @author ogawa
*/
package org.sorausagi.air.ui.setting.rss {
import mx.validators.Validator;
import mx.validators.ValidationResult;
import mx.collections.ArrayCollection;
public class DuplicateValidator extends Validator {
/* 元々のリスト */
private var list:ArrayCollection;
/* リスト内オブジェクトの名前 */
private var listName:String;
/* 除外するオブジェクト */
private var excludeObject:Object;
/* このValidatorのErrorMessage */
private var _fieldError:String = "既に使われている名前です";
public function DuplicateValidator(list:ArrayCollection, listName:String, excludeObject:Object = null) {
this.list = list;
this.listName = listName;
this.excludeObject = excludeObject;
}
public function set fieldError(message:String):void {
this._fieldError = fieldError;
}
public function get fieldError():String {
return _fieldError;
}
override protected function doValidation(value:Object):Array {
var results:Array = super.doValidation(value);
var val:String = value ? String(value) : "";
if (results.length < 0 || ((val.length == 0) && !required)) {
return results;
}
return validateDuplicate(this, value, null);
}
public function validateDuplicate(validator:Validator, value:Object, baseField:String):Array {
var results:Array = [];
for each (var item:Object in list) {
if (excludeObject != null && excludeObject == item) {
continue;
}
if (item[listName] == value) {
results.push(new ValidationResult(
true, "","deplicated",
fieldError));
break;
}
}
return results;
}
}
}
使ってみた画面はこんな感じ。