Viewmodel 属性 'links' 找不到模型类型
Viewmodel attribute 'links' cannot find the model type
当尝试在 show()
上执行以下代码时,我们得到一个异常,即 links
属性无法找到模型,如果它是由 class 指定的或者如果它被指定按实体名称。
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
是否为 class 的 if 语句失败了。
在花了一整天多的时间并发挥我们最疯狂的想象力之后,我们设法弄清楚发生了什么:
您会发现,如果您在源代码中无缘无故地使用多个模式,这些模式会相互冲突,您将被迫提供一个唯一的模式 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
}
}
}
是的,links
中的 type
属性不能更具误导性!
如果您已将模型中的 entityName
属性设置为 Film
。
,您也可以使用更短的版本 type: "Film"
现在重构
Sencha 应该做的是强制所有开发人员在 ViewModel 中显式设置模式,如果模型不是使用模式设置的,则使用 null。
当然,正如您所理解的那样,解决此类问题无法通过深入研究文档或深入研究源代码来解决,而是通过疯狂猜测使用了何种疯狂的约定。
总的来说,框架应该更明确。
当尝试在 show()
上执行以下代码时,我们得到一个异常,即 links
属性无法找到模型,如果它是由 class 指定的或者如果它被指定按实体名称。
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
是否为 class 的 if 语句失败了。
在花了一整天多的时间并发挥我们最疯狂的想象力之后,我们设法弄清楚发生了什么:
您会发现,如果您在源代码中无缘无故地使用多个模式,这些模式会相互冲突,您将被迫提供一个唯一的模式 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
}
}
}
是的,links
中的 type
属性不能更具误导性!
如果您已将模型中的 entityName
属性设置为 Film
。
type: "Film"
现在重构
Sencha 应该做的是强制所有开发人员在 ViewModel 中显式设置模式,如果模型不是使用模式设置的,则使用 null。
当然,正如您所理解的那样,解决此类问题无法通过深入研究文档或深入研究源代码来解决,而是通过疯狂猜测使用了何种疯狂的约定。
总的来说,框架应该更明确。