Viewmodel属性'链接'找不到模型类型

时间:2015-11-06 22:35:15

标签: javascript extjs mvvm extjs6 dynamic-class-creation

尝试在show()上执行以下代码时,我们得到一个例外,即links属性无法找到模型,如果它是由类指定的,或者是由entityName指定的。

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语句失败..

1 个答案:

答案 0 :(得分: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

现在,此自定义配置应传播到所有其他配置,这意味着ViewModel将无法工作,除非您指定将要使用的架构ID。

换句话说,只有在添加如下模式时,视图模型才会起作用:

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"属性设置为entityName,则还可以使用较短版本Film

现在重构

Sencha应该做的是强制所有开发人员在ViewModel中显式设置架构,如果未使用架构设置模型,则使用null。

当然,你可以理解解决这样的问题是不能通过深入了解文档或在源代码中潜入,而是使用疯狂的猜测已经使用了什么样的疯狂约定。

一般来说,框架应该更明确。