视图模型属性'links'找不到模型类型



当尝试在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语句失败。。

花了一整天的时间,用我们最疯狂的想象力,我们终于弄清楚了发生了什么:

首先检查此链接:https://www.sencha.com/forum/showthread.php?299699-任何一个模型中的任何一个-模式崩溃-树-模式-偶数-不退出&p=1118964&viewfull=1#post1118964

您会发现,如果您在源代码中无明显原因地使用多个模式,这些模式会相互冲突,并且您必须提供唯一的模式id

现在,这个自定义配置应该传播到所有其他配置,这意味着除非指定要使用的架构id,否则ViewModels将无法工作。

换句话说,视图模型只有在添加这样的模式时才能工作:

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
            }
        }
    }

是的,links中的type属性非常具有误导性!

如果已将模型内部的entityName属性设置为Film,则也可以使用较短版本的type: "Film"

立即重构

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

当然,正如你所理解的,解决这样一个问题并不是通过深入文档或深入源代码来完成的,而是通过疯狂猜测使用了什么样的疯狂约定。

总的来说,框架应该更加明确。

相关内容

  • 没有找到相关文章

最新更新