尝试将商店绑定到ViewModel

时间:2017-05-23 13:57:17

标签: extjs mvvm extjs6 extjs6-classic

我已经习惯了使用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

附属问题是:

  1. 这是在视图中设置值id的正确方法吗? ({xtype: 'rma-details', viewModel: {data: {id: id}}})?
  2. 我常常在商店类中定义代理。在这里,我不再拥有商店类,因为它是在ViewModel中定义的。像我上面那样在模型类中声明它是否正确?

1 个答案:

答案 0 :(得分:1)

您需要在模型声明中定义schema,然后为其命名空间。或者,更好的是,在基础模型中(查看api文档中的模式摘要)。

  

在描述实体之间的关联时,最好使用不包含公共名称空间部分的简写名称。这称为entityName而不是其类名。默认情况下,entityName是完整的类名。但是,如果使用命名空间,则可以丢弃公共部分,并且我们可以派生更短的名称。

您已尝试在此处使用简写名称,但由于您尚未定义架构命名空间,因此无法将其解析为模型类。

辅助回应:

  1. 是的,你可以这样做。
  2. 在我看来,这里没有对错。 您可以在视图模型中将过滤器与过滤器一起声明。 您还可以在单​​独的类中声明存储,然后在viewmodel中使用它(这是我使用的方法),此处仅指定绑定到某种viewmodel数据的配置。