Skip to content

DataModel.create()に、スキーマ例外の発生するオブジェクトを含む配列を渡した時、例外の発生するオブジェクトよりまえのアイテムは作られるのにイベントが発生しない。 #232

Closed

Description

@fukudayasuo
model.addEventListener('itemsChange', function(){ alert('itemsChange!') });
try{
    // 2番目の引数によって例外が発生する。
    model.create([{id:'00001', val:'1'}, {id:'00002', val:2}, {id:'00003', val:3}]);
} catch(e) {
    // 2番目の引数によって例外が発生する
}
// イベントは発生しない

model.get('00001'); // 例外発生までのアイテムは作成されている
model.get('00002') === null; // true
model.get('00003') === null; // true

アイテムが作成されているのにイベントが発生しないのはおかしいので、仕様を変更する。

Activity

  1. fukudayasuo commented on Aug 9, 2013

    @fukudayasuo
    Author

    途中で例外が発生した場合は、データアイテムを1つも作らない、または値をセットしないように修正します。
    (create()は引数に渡したもの全て作られる(またはセットされる)か、全て作られない(セットされない)かのどっちかになります。)

    アイテムの作成、またはアイテムのセット内で行っているvaliidate処理を別メソッドに切り分け、全てvalidateが通ってからcreate,setするように修正します。

    また、切り分けた別メソッドを外にだし、ユーザコードからアイテム生成またはセットの前にvalidateチェックを行えるようにします。

  2. added 2 commits that reference this issue on Aug 12, 2013
  3. fukudayasuo commented on Aug 12, 2013

    @fukudayasuo
    Author

    createはデータアイテムを1つも作らない、または値をセットしないように修正しました。

    model.createとitem.setは、引数チェック関数を呼び出してからcreate/setを行うようにしました。

    DataModel#validateCreate, DataItem#validateSetメソッドを公開し、ユーザコードからチェックをできるようにしました。

    テストケースの追加を行いました。

    validateCreate/validateSetは、引数をcreate/setに渡した時に例外が発生する場合はその例外オブジェクト、例外が発生しない場合はnullを返すようにしました。

    validateCreate/validateSetでは、depend項目の計算までは行いません。(depend.calcは実行しません)。
    これは、calcの戻り値がチェック時とセット時で同じになるとは限らないためです。

    そのため、depend.calcを実行した時に例外が発生するかどうかは実際にセットするまで分かりません。

  4. added a commit that references this issue on Aug 12, 2013
  5. fukudayasuo commented on Aug 12, 2013

    @fukudayasuo
    Author

    validateCreate及びvalidateSetについては、新しくissueを作成しました。
    #233

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions