Ext.data.Modelを使ったクライアントサイドバリデーション
データモデルにvalidationの定義を含めることができる。Ext.define('User', {
extend: 'Ext.data.Model',
fields: [
{name: 'name', type: 'string'},
{name: 'age', type: 'int'},
{name: 'phone', type: 'string'},
{name: 'gender', type: 'string'},
{name: 'username', type: 'string'},
{name: 'alive', type: 'boolean', defaultValue: true}
],
validations: [
{type: 'presence', field: 'age'},
{type: 'length', field: 'name', min: 2},
{type: 'inclusion', field: 'gender', list: ['Male', 'Female']},
{type: 'exclusion', field: 'username', list: ['Admin', 'Operator']},
{type: 'format', field: 'username', matcher: /([a-z]+)[0-9]{2,3}/}
]
});
バリデートはExt.data.Modelのvalidate()で行う。
結果は、Ext.data.Errorsが返される。
var errors = instance.validate();
サーバサイドバリデーション
サーバサイドのバリデーションの結果をExt.data.Model.validate()と同じ形で得るためには、データモデルのproxyにreaderを正しく設定する必要がある。
Ext.define('Employee', {
extend : 'Ext.data.Model',
idProperty : 'id',
fields : [
{ name : 'id', type : 'string' },
{ name : 'firstName', type : 'string' },
{ name : 'lastName', type : 'string' },
{ name : 'gender', type : 'string' }
],
proxy : {
url : "/コンテキストルート/employeeService",
type : "rest",
reader : {
type : 'json',
messageProperty : 'errors'
}
}
});
このデータモデルのsave()メソッドに対して、サーバ側バリデーションを返す場合、以下のようなJSONデータをサーバは返さなければならない。
{
'success' : false,
'errors' : { 'id' : 'Error Message1', 'firstName' : 'Error Message 2', 'lastName' : 'Error Message3' }
}
readerのmessagePropertyの値と、JSONデータのエラーのプロパティを一致させること。
バリデーション結果は、モデルのload(), save(), destroy()メソッドのsuccess, failureコールバックの引数 operation (ext.data.Operation) から得られる。
var emp = Ext.ModelManager.getModel('Employee');
emp.set('123', 'Fidel', 'Castro', 'Male');
emp.save({
waitMsg : 'Saving...',
success : function(operation){ },
failure : function(operation){
var errors = operation.getError();
}
});
validationの結果をformに適用する
formのmarkInvalid()を使ってvalidationの結果をformに適用する事が出来る。
var errors = instance.validate(); form.markInvalid(errors);