このサブクラスとして既に実装されている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;
}
}
}
使ってみた画面はこんな感じ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCyc6XEmhkFsCZy7vF_h_wmCtDSq-c4Jg1MrDgz5LnnK3eqfBHSpRneQXOqqy8xXYB1wcYkASEhXL-_1a0qzv9TAVqySei72VQrlc4Isxuf7bDtqFysSQNxgsF4gaLCMGtPA0wuAauGyk/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-02-01+0.34.13%EF%BC%89.png)