hifive / hifivemain

main repository
http://www.htmlhifive.com/
Other
40 stars 10 forks source link

DataModel で base を指定すると base に指定した Model の作成に失敗するようになる #198

Closed 3bch closed 11 years ago

3bch commented 11 years ago

確認した環境

以下のようなコードを書いたとき parentModel を create するタイミングでエラーが発生します。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>hifive DataModel BUG</title>
    </head>
    <body>
        <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
        <script src="/hifive/h5-1.1.4.dev.js"></script>
        <script>
            var manager = h5.core.data.createManager('DataManager', 'model');

            var parentModel = manager.createModel({
                name: 'ParentModel',
                schema: {
                    id: {
                        id: true,
                        type: 'integer',
                    }
                }
            });

            var childModel = manager.createModel({
                name: 'ChildModel',
                base: '@ParentModel',
                schema: {
                    name: {
                        type: 'string',
                    }
                }
            });

            parentModel.create({ id: 0 });
        </script>
    </body>
</html>

Chrome だと h5-1.1.4.dev.js の 10710行目 で Uncaught TypeError: Object #<Object> has no method 'name' が発生し、Firefox だと同じ箇所で TypeError: this._itemValueCheckFuncs[prop] is not a function が発生することを確認しました。

childModel 側を削除するとエラーが発生しなくなることから、base を継承した側の name が base 側に影響をおよぼしてしまっているようです。

原因と思われる箇所

ちょっと原因を追ってみたんですが、base を指定した Model を createModel() で設定しているあいだに、validateDescripter() の中(h5-1.1.4.dev.js の 9500行目)で以下のように baseSchema を書き換えている部分が原因ではないかと思います。

schema = $.extend(baseSchema, schema);
fukudayasuo commented 11 years ago
schema = $.extend({}, baseSchema, schema);

として、baseSchemaを上書かないようにして修正しました。 また、baseSchemaが上書かれることでたまたま動いていた箇所があったので、その他の箇所も修正しました。