You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExtJS 6.5.1:如何在ViewModel内部获取Store?

在ExtJS 6.5.1中获取ViewModel内的Store

嘿,我来帮你理清楚怎么从ViewModel里拿到你定义的info Store,毕竟从MVC转MVVM初期,ViewModel和ViewController的交互确实容易让人困惑。针对你的场景,我分几种常用情况来说明:

1. 在关联的ViewController中获取(最推荐的方式)

因为ViewController和对应的View是绑定的,而View又关联了你定义的ViewModel,所以在VC里可以非常方便地拿到Store:

Ext.define("MYAPP.view.ViewportController",{
    extend:"Ext.app.ViewController",
    alias: 'controller.viewport',

    // 举个例子,比如某个按钮的事件处理函数
    onLoadDataClick: function() {
        // 获取当前View绑定的ViewModel
        var vm = this.getViewModel();
        // 通过Store的名称获取实例
        var infoStore = vm.getStore('info');
        
        // 接下来就可以对Store进行操作了,比如重新加载数据
        infoStore.reload({
            callback: function(records, operation, success) {
                if (success) {
                    console.log('数据加载成功');
                }
            }
        });
    }
});

这种方式是MVVM架构下的标准用法,VC负责逻辑处理,通过ViewModel获取数据,完全符合职责分离的原则。

2. 在View组件内部获取

如果你需要在View的某个组件方法里直接获取Store(虽然更推荐把逻辑放在VC里),可以通过View实例拿到ViewModel:

Ext.define("MYAPP.view.Viewport",{
    extend:"Ext.container.Viewport",
    viewModel: 'viewport', // 绑定你的ViewModel别名
    controller: 'viewport',

    items: [{
        xtype: 'button',
        text: '手动加载数据',
        handler: function(btn) {
            // 向上找到Viewport实例
            var view = btn.up('viewport');
            // 获取ViewModel
            var vm = view.getViewModel();
            // 获取Store
            var infoStore = vm.getStore('info');
            
            infoStore.load();
        }
    }]
});

3. 在其他全局/工具类中获取(不推荐,尽量用绑定方式)

如果是在脱离View/VC的场景下需要获取这个Store,可以通过组件查询或者ViewModel管理器来获取:

// 方式1:先找到Viewport组件实例,再拿ViewModel和Store
var viewport = Ext.ComponentQuery.query('viewport')[0];
if (viewport) {
    var vm = viewport.getViewModel();
    var infoStore = vm.getStore('info');
}

// 方式2:通过ViewModel别名直接获取实例(注意:如果有多个同名VM实例会出问题)
var vm = Ext.ViewModelManager.get('viewport');
if (vm) {
    var infoStore = vm.getStore('info');
}

小优化:ViewModel定义更简洁的写法

另外,你当前在构造函数里用setStores()定义Store是可行的,但ExtJS提供了更简洁的stores配置项写法,不用写构造函数:

Ext.define("MYAPP.view.ViewportViewModel",{
    extend:"Ext.app.ViewModel",
    alias: 'viewmodel.viewport',
    // 直接用stores配置声明Store
    stores: {
        info: {
            autoLoad:true,
            fields:["TEST"],
            proxy:{
                type:"ajax",
                url:"blah.html",
                reader:{
                    type:"json"
                }
            }
        }
    }
});

这样代码更清晰,也符合ExtJS的最佳实践。

内容的提问来源于stack exchange,提问作者stackato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:36