我已经习惯了使用MVC模式的ExtJs,并且我试图实现MVVM模式。我无法将商店绑定到我的视图中。
我有一个主网格,并在选择一条线时尝试打开一个细节网格。
detailsView = mainPanel.add({
xtype: 'rma-details',
viewModel: {data: {id: id}}
})
Ext.define('Mb.view.rma.Details', {
extend: 'Ext.grid.Panel',
alias: 'widget.rma-details',
requires: [
'Mb.view.rma.DetailsController',
'Mb.view.rma.DetailsModel'
],
controller: 'rma-details',
viewModel: {type: 'rma-details'},
bind: {
title: 'Retour n° {id}',
store: '{details}'
},
(...)
});
Ext.define('Mb.view.rma.DetailsModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.rma-details',
requires: ['Mb.model.rma.Detail'],
data: {
id: 0
},
stores:{
details: {
model: 'rma.Detail',
filters: [{
property: 'rma',
value: '{id}'
}]
}
}
});
Ext.define('Mb.model.rma.Detail', {
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int'},
{name: 'rma', type: 'int'},
(...)
],
proxy: { // cf. 2nd subsidiary question
(...)
}
});
视图的标题正确绑定到id
的值。
但对于商店,我得到错误:
[E] Ext.data.schema.Schema.lookupEntity():没有这样的实体" rma.Detail"。
未捕获的错误:没有这样的实体" rma.Detail"。
我不明白为什么在ViewModel中无法识别对模型的引用(model: 'rma.Detail'
)。使用MVC模式我从不需要引用模型,我总是使用类似于rma.Details
的引用来引用商店。
主要问题是:如何在ViewModel中声明模型rma.Details
?
附属问题是:
id
的正确方法吗? ({xtype: 'rma-details', viewModel: {data: {id: id}}}
)?答案 0 :(得分:1)
您需要在模型声明中定义schema,然后为其命名空间。或者,更好的是,在基础模型中(查看api文档中的模式摘要)。
在描述实体之间的关联时,最好使用不包含公共名称空间部分的简写名称。这称为entityName而不是其类名。默认情况下,entityName是完整的类名。但是,如果使用命名空间,则可以丢弃公共部分,并且我们可以派生更短的名称。
您已尝试在此处使用简写名称,但由于您尚未定义架构命名空间,因此无法将其解析为模型类。
辅助回应: