0

で次のコードを実行しようとすると、クラスで指定されているか、entityName で指定されている場合にshow()、属性がモデルを見つけられないという例外が発生します。links

Ext.define('myapp.view.film.FilmsViewController', {
//extend: 'myapp.view.base.ViewController',
extend: 'Ext.app.ViewController',

alias: 'controller.films',

onAdd: function(button, event, options) {
    this.createDialog(null)
},

createDialog: function(record) {
    var me = this;
    var view = me.getView();    //here is film panel

    me.isEdit = !!record;   //convert record to boolean

    me.dialog = view.add({ //#3
        xtype: 'filmwindow',
        viewModel: { //#4
            data: { //#5
                title: record ? 'Edit: ' + record.get('title') : 'Add New Film',
            },
            links: { //#6
                currentFilm: record || { //#7
                    //type: 'Film',
                    type: 'myapp.model.film.Film',
                    create: true
                }
            }
        },
        //session: true
    });
    me.dialog.show();
},

コードの一部にコメントを付けるとlinks、残りは問題なく動作します。

例外の興味深い部分は次のとおりです。

[E] Ext.app.ViewModel.getRecord(): Invalid model name: myapp.model.film.Film
log @ ext-all-rtl-debug.js?_dc=1446847440066:9121
Ext.apply.raise @ ext-all-rtl-debug.js?_dc=1446847440066:2606
Ext.raise @ ext-all-rtl-debug.js?_dc=1446847440066:2691
Ext.define.privates.getRecord @ ext-all-rtl-debug.js?_dc=1446847440066:99865
Ext.define.linkTo @ ext-all-rtl-debug.js?_dc=1446847440066:99748
Ext.define.privates.applyLinks @ ext-all-rtl-debug.js?_dc=1446847440066:100120

ソース コードに飛び込むmyapp.model.film.Filmと、クラスかどうかをチェックする if ステートメントが失敗することがわかります。

4

1 に答える 1

1

丸一日以上を費やし、私たちの想像力を駆使して、何が起こっているのかを突き止めることができました。

まず、このリンクを確認してください: https://www.sencha.com/forum/showthread.php?299699-Any-use-of-a-model-schema-breaks-Tree-model-even-if-not-extending .&p=1118964&viewfull=1#post1118964

明確な理由もなくソース コードで複数のスキーマを使用すると、これらのスキーマが互いに競合し、一意のスキーマ IDを指定する必要があることがわかります。

これで、このカスタム構成を他のすべての構成に反映する必要があります。つまり、使用するスキーマ ID を指定しない限り、ViewModel は機能しません。

つまり、ビュー モデルは、次のようなスキーマを追加した場合にのみ機能します。

viewModel: {
        schema: "youruniqueschemaid",

        data: {
            title: record ? 'Edit: ' + record.get('title') : 'Add New Film',
        },
        links: {
            currentFilm: record || {
                //type: 'Film',
                type: 'myapp.model.film.Film',
                create: true
            }
        }
    }

はい、type内の属性linksはこれ以上誤解を招くことはありません!

モデル内の属性を としてtype: "Film"設定した場合は、短いバージョンを使用することもできます。entityNameFilm

今すぐリファクタリング

代わりに Sencha がすべきことは、すべての開発者に ViewModel 内でスキーマを明示的に設定し、モデルがスキーマを使用して設定されていない場合は null を使用するよう強制することです。

もちろん、このような問題を解決するには、ドキュメントを調べたり、ソース コードを調べたりすることではできません。

一般に、フレームワークはより明確にする必要があります。

于 2015-11-07T11:23:28.760 に答える