開発者ブログ
リファレンス(仕様詳細) » データモデル動作仕様

データモデル動作仕様

Last modified by simdy on 2016/02/18, 10:26

DataItem/ObservableItemのget/setメソッドの挙動

※以降「アイテム」は、DataItemとObservableItemの両方を指す略語とします

get()

メソッド説明
get()アイテムが持つ全ての値を格納したオブジェクトを取得します。
get(String key)アイテムが持つ指定したプロパティの値を取得します。
var descriptor = {
    name: 'TestModel',
    schema: {
        num: {
            id: true
        },
        name: {
            type: 'string'
        },
        age: {
            type: 'number'
        },
        address: {
            type: 'string'
        }
    }
};

var manager = h5.core.data.createManager('TestManager');
var model = manager.createModel(descriptor);

// DataItem
var item = model.create({num: '1', name:'yamada', age:20, address:'tokyo'});
// 引数を指定した場合
console.log(item.get('name')); // yamada
// 引数を指定しない場合
console.log(item.get()) // {num:'1',name:'yamada',age:20,address:'tokyo'}

// ObservableItem
var obsItem = h5.core.data.createObservableItem(schema);
obsItem.set({num: '1', name:'yamada', age:20, address:'tokyo'});
// 引数を指定した場合
console.log(obsItem.get('name')); // yamada
// 引数を指定しない場合
console.log(obsItem.get()) // {num:'1',name:'yamada',age:20,address:'tokyo'}

第一引数に、スキーマに定義されていないプロパティ名を指定した場合、

スキーマに定義されていないプロパティを取得することはできません。モデル"xxxxx"のスキーマに"xxxxx"は定義されていません。(code=15011)

の例外が発生します。

set()

メソッド説明
set(String key, Any value)指定されたキーのプロパティに値を設定します。
set(Any obj) { キー1: 値1, キー2: 値2, ... } という構造のオブジェクトを指定することで、複数のプロパティに対してまとめて値を設定します。
var descriptor = {
    name: 'TestModel',
    schema: {
        num: {
            id: true
        },
        name: {
            type: 'string'
        },
        age: {
            type: 'number'
        },
        address: {
            type: 'string'
        }
    }
};

var manager = h5.core.data.createManager('TestManager');
var model = manager.createModel(descriptor);

// DataItem
var item = model.create({id: '1', name:'yamada', age:20, address:'tokyo'});
item.set('address', 'saitama');
console.log(item.get()); // {num: '1', name:'yamada', age:20, address:'saitama'}
item.set({name:'takahashi', age:15, address:'chiba'});
console.log(item.get()); // {num: '1', name:'takahashi', age:15, address:'chiba'}

// ObservableItem
var obsItem = h5.core.data.createObservableItem(schema);
obsItem.set('address', 'saitama');
console.log(obsItem.get()); // {num: '1', name:'yamada', age:20, address:'saitama'}
obsItem.set({name:'takahashi', age:15, address:'chiba'});
console.log(obsItem.get()); // {num: '1', name:'takahashi', age:15, address:'chiba'}

ただし、以下のようにスキーマでid:trueと指定したプロパティに対して、値を設定することはできません。

var descriptor = {
    name: 'TestModel',
    schema: {
        num: {
            id: true
        },
        name: {
            type: 'string'
        },
        age: {
            type: 'number'
        },
        address: {
            type: 'string'
        }
    }
};

var manager = h5.core.data.createManager('TestManager');
var model = manager.createModel(descriptor );
var item = model.create({num: '1', name:'yamada', age:20, address:'tokyo'});

// DataItem
item.set('num', '10'); // id:trueが設定されているので値を変更することができない

// ObservableItem
var obsItem = h5.core.data.createObservableItem(schema);
item.set('num', '10'); // id:trueが設定されているので値を変更することができない
id指定されたプロパティに値をセットすることはできません。(code=15005)

の例外が発生します。

また、第二引数で、スキーマに定義されていないプロパティ名を持つをデータを設定することはできません。

var descriptor = {
    name: 'TestModel',
    schema: {
        num: {
            id: true
        },
        name: {
            type: 'string'
        },
        age: {
            type: 'number'
        },
        address: {
            type: 'string'
        }
    }
};

var manager = h5.core.data.createManager('TestManager');
var model = manager.createModel(descriptor);
var item = model.create({num: '1', name:'yamada', age:20, address:'tokyo'});

// DataItem
item.set('hoge', '10'); // hogeはスキーマに定義されていないので例外が発生する

// ObservableItem
var obsItem = h5.core.data.createObservableItem(schema);
obsItem.set('hoge', '10') // hogeはスキーマに定義されていないので例外が発生する
スキーマに定義されていないプロパティに値をセットすることはできません。モデル"xxxxx"のスキーマに"xxxxx"は定義されていません。(code=15010)

の例外が発生します。

依存プロパティの更新

スキーマのプロパティにdependが指定されていた場合、そのプロパティはset()が実行されたタイミングで値が更新(再計算)されます。
詳細についてはデータモデルの継承 - イベントとdependを参照して下さい。

また、set()時のキーに依存プロパティが指定されていた場合は、
値が厳密等価比較(===)でtrueになる場合に限り、代入が無視されます。
falseになるような場合は、例外が発生します。

//dependPropの値は'ABC'であるとする

item.set('dependProp', 'ABC'); //代入が無視される
item.set('dependProp', 'XYZ'); //例外が発生

値の変更を検知する

アイテムの値がset()によって変更されたタイミングで、"change"イベントが発生します。
このイベントを拾うことによってアイテムの変更を検知することができます。

詳細については、データアイテムの更新とイベント - データアイテム changeイベントを参照して下さい。

スキーマのtypeに配列指定したプロパティが変更された場合のイベント発生について

スキーマのtype属性に指定した値が以下のパターンの場合に、DataItemクラスのchangeイベントが発生するか表にまとめました。

  • データモデルの配列型 (@DataModel[])
  • ObservableArrayを格納したany型 (any)
  • anyの配列型 (any[])
var manager = h5.core.data.createManager('TestManager');
var descriptorA = {
    name: 'TestModel',
    schema: {
        num: {
            id: true
        },
        name: {
            type: 'string'
        },
        age: {
            type: 'number'
        },
        address: {
            type: 'string'
        }
    }
};

var testModel = manager.createModel(descriptorA);
var testItem = testModel.create({num:'1'});

var descriptor2 = {
    name: 'TestModel2',
    schema: {
        id: {
            id: true
        },
        items1: {
            type: '@TestModel[]'
        },
        items2: {
            type: 'any'
        },
        items3: {
            type: 'any[]'
        }
    }
};

var obsAr = h5.core.data.createObservableArray();
obsAr.push(testItem);

var model = manager.createModel(descriptorB);
var item = model.create({id:'1', items1:[testItem], items2:obsAr, items3:[testItem]});

item.addEventListener('change', function(ev) {
    alert('changed');
});

var testItem2 = testModel.create({num:'2'});
var newValue = [testItem2];

// @TestModel[]
item.set('items1', newValue);
// any
obsAr.copyFrom(newValue);
// any[]
item.set('items3', newValue);
typeイベント名
change
@DataModel[]
any(ObservableArray)×
any[]

type:@DataModel[]のプロパティに格納されているObservableArrayの中身をDataItem#set()で変更した場合、ObservableArrayのインスタンスは変更されず中身だけが変更されchangeイベントが発生しますが、
type:anyのプロパティに格納されたObservableArrayの中身を変更してもchangeイベントは発生しません。

ただし、type:anyのプロパティに格納されたObservableArrayを別のObservableArrayに変更した場合は、chnageイベントが発生します。

var testItem2 = testModel.create({num:'2'});
var obsAr2 = h5.core.data.createObservableArray();
obsAr2.push(testItem2);

item.set('items2', obsAr2); // item2プロパティに格納されているObservableArrayが別のObservableArrayに変更されたのでchangeイベントが発生する

上記以外のtypeに配列型を指定した場合に発生するイベントの詳細な仕様については、リファレンス(仕様詳細) - typeで配列型を指定した場合の挙動 を参照して下さい。


Copyright (C) 2012-2017 NS Solutions Corporation, All Rights Reserved.