Ext JS の Ext.data.field.* の Conversion と Serialization についてメモっとく。モデルに何となく追加しているフィールドの動作を理解するのに重要なんではないかと。
継承ツリー
Ext.data.field.* の継承ツリーを掲載しとく。標準で用意されているフィールドの型は多くないが必要十分という感じ。特筆すべき点は Number が Integer を継承していることくらいかな。
フィールドの型一覧
フィールドの型を表にまとめておく。type
は Ext.data.Model でフィールドの型を指定するときに設定する値。convert
は Ext.data.Model.set でフィールドに値を設定するときの変換で使用される関数の処理内容。serialize
は Ext.data.Model.getData でフィールドの値を取得するときの変換で使用される関数の処理内容。
ちなみに convert
と serialize
は Ext.data.Model でフィールドを設定するときに上書きできる。
クラス | 説明 | type | convert | serialize |
---|---|---|---|---|
Field | 型なし値のフィールド | auto | なし | なし |
Boolean | 真偽値のフィールド | bool | true・yes・on・1であれば true、そうでなければ false の真偽値(Boolean 型)に変換する。 | なし |
Date | 日付値のフィールド | date | dateReadFormat か dateFormat があれば Ext.Date.parse で、なければ Date.parse で日付値(Date オブジェクト)に変換する。 | dateWriteFormat か dateFormat があればそのフォーマット、なければ timestamp フォーマットを指定した Ext.Date.format で文字列値(String 型)に変換する。 |
Integer | 整数値のフィールド | int | parseInt で整数値(Number 型の整数値)に変換する。 | なし |
Number | 実数値のフィールド | float | parseFloat で実数値(Number 型の実数値)に変換する。 | なし |
String | 文字列値のフィールド | string | String で文字列値(String 型)に変換する。 | なし |
ほかのフィールドから計算されるフィールド
Ext.data.Model でフィールドを設定するときに convert
と serialize
以外に calculate
を設定できる。下記のように calculate
はほかのフィールドから計算できるフィールドを作成するときに利用する。
Ext.define('Author', {
extend: 'Ext.data.Model',
fields: [
{
type: 'string',
name: 'firstName'
},
{
type: 'string',
name: 'lastName'
},
{
type: 'string',
name: 'fullName',
calculate: function(data) {
return data.firstName + ' ' + data.lastName;
}
}
]
});
convert
でも同様のことができるが、その場合は依存関係を指定する必要がある。calculate
は依存するフィールドを calculate
に指定した関数のソースコードから自動的に判断してくれる点で便利だ。ただ正規表現でパターンマッチして判断しているだけであることは頭の片隅に置いておこう。具体的な正規表現のパターンは Ext.data.field.Field のソースコードを参照してほしい。
フィールドのカスタム型
念のため書いておくと Ext.data.field.* を継承することでカスタム型を作成できる。単純な型は Ext.data.field.Boolean あたりのソースを参考に、複雑な型は Ext.data.field.Date あたりのソースを参考に実装すればいいと思う。なおカスタム型にはバリデーターを付与することもできる。