ExtJS 6 Combobox设置queryMode:local后数据不显示求助
你遇到的问题核心在于Combobox关联的Store实例和你在控制器中加载数据的Store实例不是同一个,导致queryMode: 'local'时Combobox的Store是空的,自然无法展示数据。
具体原因
在你的视图代码中,Combobox的store配置是{ type: 'sitedomain' },这会创建一个全新的SiteDomain Store实例;而你在控制器中调用me.getSiteDomainStore()加载数据的是另一个Store实例(由控制器stores: [ 'SiteDomain' ]注册的全局实例)。两个实例相互独立,所以控制器加载的数据并不会同步到Combobox的Store中。
当queryMode: 'remote'时,Combobox会自己触发远程请求获取数据,所以能正常显示;但local模式下,它只会读取自身关联的Store本地数据,而这个新实例并没有被加载数据,因此无法展示。
解决方案
有两种简单的修复方式,任选其一即可:
方案1:让Combobox直接引用已注册的Store实例
修改视图中Combobox的store配置,直接使用Store的注册名称(对应你定义的Stm.store.SiteDomain),而不是创建新实例:
xtype: 'cps-combobox', fieldLabel: 'Domain', itemId: 'cmbSiteDomain', queryMode: 'local', store: 'SiteDomain', // 替换原有的 { type: 'sitedomain' } width: 350, displayField: 'siteDomain', valueField: 'siteId',
这样Combobox会直接关联控制器中注册的那个Store实例,当你在控制器中调用store.load()加载数据后,Combobox就能在local模式下读取到这些数据。
方案2:在控制器中手动为Combobox绑定已加载的Store
如果你需要保持视图中Store的配置方式,可以在控制器的setupStmList方法里,将加载好数据的Store实例赋值给Combobox:
setupStmList: function() { console.log(Ext.getDisplayName(arguments.callee)); var me = this; var store = me.getSiteDomainStore(); var record = Cps.Util.baseRecord(); store.load({ params: param, callback: function(records, operation, success) { // ... 原有回调代码保持不变 ... // 新增:将加载好的Store赋值给Combobox me.getList().down('#cmbSiteDomain').setStore(store); } }); me.firstSorters = this.getHpUpdateStore().getSorters(); },
这样Combobox就会使用已经加载了数据的Store实例,local模式下就能正常展示数据了。
额外验证点
为了确保万无一失,你可以额外确认:
displayField: 'siteDomain'和valueField: 'siteId'与Stm.model.SiteInfo中定义的字段名完全一致(既然remote模式正常,这点应该没问题);- Store加载完成后,确实有数据(可以在回调中打印
records.length确认)。
内容的提问来源于stack exchange,提问作者maryyyyyyy

