ExtJS中能否为Grid Panel的bind属性设置if else条件?
实现GridPanel动态绑定不同Store的方案
没问题,我来帮你搞定这个根据用户名动态切换Grid绑定Store的需求!ExtJS里没法直接在bind属性里写if/else,但有两种很实用的方式可以实现你的逻辑:
方案一:用ViewModel的Formulas(推荐,符合MVVM思路)
你可以在ViewModel里定义一个计算属性(formula),根据localStorage里的用户名返回对应的Store,然后让Grid绑定这个计算属性就行。
修改你的ViewModel代码,添加formulas配置:
stores: { dataStore: { model: 'MyApp.first.Model', autoLoad: true, session: true }, listStore: { model: 'MyApp.second.Model', autoLoad: true, session: true } }, formulas: { dynamicStore: function(get) { // 从localStorage获取用户名 const username = localStorage.getItem('username'); // 根据条件返回对应Store return username === 'sample@adress.com' ? this.getStore('dataStore') : this.getStore('listStore'); } }
然后修改Grid的绑定,指向这个计算出来的dynamicStore:
Ext.define('MyApp.base.Grid', { extend: 'Ext.grid.Panel', bind: '{dynamicStore}' });
这种方式的好处是把逻辑放在ViewModel里,符合ExtJS的MVVM架构,而且如果后续需要调整判断逻辑,只需要修改ViewModel即可。
方案二:直接在Grid的初始化方法里设置Store
如果你不想修改ViewModel,也可以直接在Grid的initComponent方法里动态判断并设置Store:
Ext.define('MyApp.base.Grid', { extend: 'Ext.grid.Panel', initComponent: function() { // 获取用户名并判断要绑定的Store名称 const username = localStorage.getItem('username'); const targetStoreName = username === 'sample@adress.com' ? 'dataStore' : 'listStore'; // 从ViewModel获取对应的Store并设置给Grid this.store = this.getViewModel().getStore(targetStoreName); // 别忘了调用父类的初始化方法 this.callParent(arguments); } });
这种方式更直接,适合逻辑比较简单的场景,但如果后续有多处需要用到这个判断逻辑,就不如方案一复用性强。
额外提示:处理用户名动态变化的情况
如果你的应用中用户名可能在运行过程中改变(比如用户切换账号),你还可以添加监听来自动更新Grid的Store:
比如在方案一的基础上,让计算属性监听用户名的变化(如果ViewModel里有绑定用户名的属性):
formulas: { dynamicStore: { bind: '{currentUsername}', // 假设ViewModel里有绑定到localStorage的currentUsername属性 deep: true, get: function(username) { return username === 'sample@adress.com' ? this.getStore('dataStore') : this.getStore('listStore'); } } }
或者在方案二的Grid里监听localStorage的变化:
Ext.define('MyApp.base.Grid', { extend: 'Ext.grid.Panel', initComponent: function() { this.setDynamicStore(); // 监听localStorage变化 window.addEventListener('storage', this.onStorageChange.bind(this)); this.callParent(arguments); }, setDynamicStore: function() { const username = localStorage.getItem('username'); const targetStoreName = username === 'sample@adress.com' ? 'dataStore' : 'listStore'; this.setStore(this.getViewModel().getStore(targetStoreName)); }, onStorageChange: function(e) { // 只有当username变化时才更新Store if (e.key === 'username') { this.setDynamicStore(); } }, // 组件销毁时记得移除监听,避免内存泄漏 destroy: function() { window.removeEventListener('storage', this.onStorageChange.bind(this)); this.callParent(arguments); } });
内容的提问来源于stack exchange,提问作者Nuri Engin
相关产品推荐
相关产品推荐

