【问题标题】:Trying to bind a store to a ViewModel尝试将商店绑定到 ViewModel
【发布时间】:2017-05-23 13:57:16
【问题描述】:

我已经习惯了带有 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. 我习惯于总是在 store 类中定义代理。这里我没有 store 类了,因为它是在 ViewModel 中定义的。像我上面那样在模型类中声明它是否正确?

【问题讨论】:

    标签: extjs mvvm extjs6 extjs6-classic


    【解决方案1】:

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

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

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

    附属回应:

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

    【讨论】:

    • 您链接到的文档说:默认情况下会创建此类的单个实例。那我为什么要定义一个模式呢?您的意思是在模型中添加schema:{namespace:'Mb.model'} 应该可以解决问题吗?
    • 是的,这应该可以解决问题。默认实例没有指定命名空间配置。如果不想声明 schema,可以在 store 声明中指定模型的完整类名。
    • 在我的 Viewmodel 中,我将 model: 'rma.Detail' 替换为 store: 'rma.Details',现在我不再需要任何 schema 声明。但是现在我遇到了另一个问题:rma.Details 存储没有加载,即使它配置为remoteFilter: true, autoLoad: true
    • 我会问一个新问题。如果我在这里更新我的代码,您的答案将不再是答案。在这里stackoverflow.com/questions/44138747/…
    • 终于写完了新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多