【问题标题】:Why doesn't a store declared in a ViewModel get loaded?为什么没有加载 ViewModel 中声明的商店?
【发布时间】:2017-10-23 15:20:18
【问题描述】:

此问题与Trying to bind a store to a ViewModel 相关,但问题不同。

我在这样的视图模型中声明一个商店:

Ext.define('Mb.view.rma.DetailsModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.rma-details',
    requires: ['Mb.model.rma.Detail'],
    data: {
        id: 0
    },
    stores:{
        details: {
            //store: 'rma.Details',
            type: 'rmaDetails', // correction as suggested by @scebotari
            filters: [{
                property: 'rma',
                value: '{id}'
            }],
            remoteFilter: true
        }
    }
});

当我实例化视图时,值 id 在视图模型中正确更新(我可以看到这一点,因为视图通过绑定标题反映了它):

Ext.define('Mb.view.rma.Details', {
    extend: 'Ext.grid.Panel',
    requires: [
        'Mb.view.rma.DetailsModel'
    ],
    viewModel: {
        type: 'rma-details'
    },
    bind: {
        title: 'Retour n° {id}',
        store: '{details}'
    },

我面临的问题是商店没有被加载,即使视图模型中有remoteFilter: true 属性(在商店类而不是视图模型中设置remoteFilter: true 不会改变行为)。

完成代码,这里是商店(没什么特别的):

Ext.define('Mb.store.rma.Details', {
    extend: 'Ext.data.Store',
    model: 'Mb.model.rma.Detail',
    alias: 'rmaDetails', // correction as suggested by @scebotari
    proxy: {
        (...)
    },
    remoteFilter: true
});

主要问题:为什么商店没有加载?

辅助问题:显示详细信息网格(例如发票行)似乎是一个常见问题。我不确定我正在尝试的是否是使用 MVVM 解决此问题的推荐方法。 MVVM 似乎比 MVC 更好,因为它提供了一次打开多个细节实例的可能性。我没有找到这个案例的例子。有没有推荐的方法来解决这个问题?

注意事项:

过滤器按应有的方式应用。

{details} 的店铺好像不是连锁店。其实在viewmodel中把store: 'rma.Details'改成source: 'rma.Details'就变成了连锁店。

【问题讨论】:

  • 你有什么问题?
  • @LudovicFeltz 我还在写这个问题。这里是。抱歉,问题不完整。
  • 好的,我删除了我的反对票

标签: extjs mvvm extjs6 extjs-stores


【解决方案1】:

据我所知,这不是您在视图模型中使用在单独类中声明的商店的方式。

在声明要在视图模型中使用的商店时,应指定“别名”配置,如下所示:

Ext.define('Mb.store.rma.Details', {
    extend: 'Ext.data.Store',
    model: 'Mb.model.rma.Detail',
    alias: 'store.rmaDetails',
    proxy: {
        (...)
    }
});

然后在“类型”存储配置中的视图模型中使用此别名:

stores:{
    details: {
        type: 'rmaDetails',
        filters: [{
            property: 'rma',
            value: '{id}'
        }],
        remoteFilter: true,
        autoLoad: true
    }
}

我不知道为什么这还没有记录。可能是因为这个功能是后来添加的 (https://www.sencha.com/forum/showthread.php?284012-Use-existing-Store-in-ViewModel)。

设置autoLoad: true时会自动加载数据。视图模型中的商店配置扩展了商店类store.rmaDetails。每个视图实例都有自己关联的存储实例(不同于默认实例.getStore('rma.Details')

【讨论】:

  • 谢谢。这个信息很有意思。但这并没有解决商店没有加载的问题。要加载它,我现在必须在控制台中执行:grid.getStore().load()
  • 当我以我的方式绑定商店时,代理是type: 'memory'。您的方式,代理是正确的(与原始商店相同)。
  • 非常感谢您提供的这个有用的答案,它帮助我纠正了一个问题。尽管如此,我无法将其标记为已接受,因为它不能解决主要问题。
  • 使用type 配置在视图模型中定义商店时,会创建新的商店实例。这不是.getStore('rma.Detail')获取的全局实例。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多