为什么没有在ViewModel中声明的商店被加载?

时间:2017-05-23 15:13:02

标签: extjs mvvm extjs6 extjs-stores

此问题与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(我可以看到这个,因为View通过绑定标题反映了它):

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}'
    },

我面临的问题是,即使在viewmodel中存在remoteFilter: true属性,商店也不会被加载(在商店类中设置remoteFilter: true而不是viewmodel不改变行为。)

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

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}似乎不是一个链式商店。事实上,在视图模型中将store: 'rma.Details'更改为source: 'rma.Details'时,它会成为一个链式存储。

1 个答案:

答案 0 :(得分:2)

据我所知,这不是你如何在视图模型中使用在单独的类中声明的存储。

在声明要在视图模型中使用的商店时,应该像这样指定“别名”配置:

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

然后在“type”存储配置中的viewmodel中使用此别名:

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时,数据会自动加载。 viewmodel中的商店配置扩展了商店类store.rmaDetails。每个视图实例都有自己的商店实例关联(与默认实例.getStore('rma.Details')不同。