【问题标题】:Combobox store loaded but won't display组合框商店已加载但不会显示
【发布时间】:2013-08-22 14:25:43
【问题描述】:

我想在组合框发生更改时更新组合框存储并显示此更改的存储。我的商店正在加载,但组合框不会显示它。我可以像我想显示的那样显示本地存储,但不能对远程 json 存储执行相同的操作。

我有一个像这样的“ProcessController”:

onComboboxChange: function(combo, newValue, oldValue) {
    var upContainer = combo.up('container');

    if(combo.itemId == "cmbServiceList") {
        MyApp.app.globals.cmbServiceStore = this.createServiceCmbStore(upContainer.getComponent('cmbServiceList').getRawValue());
    }
},

createServiceCmbStore: function(inputData){
    var data = {"inputData": inputData};

    var mainController =  MyApp.app.getController('MainController');
    var cmbServiceData = mainController.callService(data,'getServices','json');
    var classServices = Ext.JSON.decode(cmbServiceData);

    var projectStore = Ext.create('Ext.data.Store', {
        fields: ['key', 'text'],
        data: classServices
    });
    return projectStore;
}

init: function(application) {
    this.control({
        'combobox': {
            change: this.onComboboxChange
        }
    });
    _myAppGlobal = this;
},

这是我在主视口中的组合框:

{
    xtype : 'combobox',
    anchor : '80%',
    listConfig : {
        loadingText : 'Searching...',
        emptyText : 'No matching posts found.'
    },
    typeAhead : true,
    itemId : 'cmbServiceList',
    fieldLabel : 'Servis Adı:',
    hideTrigger : true,
    displayField : 'text',
    store : MyApp.app.globals.cmbServiceStore,
    valueField : 'key',
    minChars : 1,
    queryMode : 'local',
    forceSelection: true
}

MyApp.app.globals.cmbServiceStoreapp.js中定义的全局变量

当我调试代码时,我可以看到商店已加载,但它不会在组合框中显示任何存储的值。

【问题讨论】:

  • if(combo.itemId == "cmbServiceList") { MyApp.app.globals.cmbServiceStore = this.createServiceCmbStore(upContainer.getComponent('cmbServiceList').getRawValue()); upContainer.getComponent('cmbServiceList').bindStore(MyApp.app.globals.cmbServiceStore); } 而不是 if(combo.itemId == "cmbServiceList") { MyApp.app.globals.cmbServiceStore = this.createServiceCmbStore(upContainer.getComponent('cmbServiceList').getRawValue()); } 解决了这个问题。
  • 将其发布为答案 :) 它不可读,实际上是一个答案,也许它可以帮助其他有类似问题的人
  • 抱歉,我试过了,但网站显示“您无法在 8 小时内回答您自己的问题”

标签: javascript json extjs extjs4


【解决方案1】:

这里的问题主要是,当您的组合框被创建时,MyApp.app.globals.cmbServiceStore 为空或未定义,一旦组合框被初始化,然后您尝试定义您的商店,它不会将组合框作为给定的参考在初始化组合框期间未定义。

根据您的代码,您似乎只是在更改商店的数据而不是商店字段。因此,最好在组合框初始化之前创建存储,然后在组合框更改时,您只需使用 store.add 将数据添加到存储

我会推荐另一种方法,即为您的商店添加一个代理以获取服务,然后在组合更改时执行 store.load()

【讨论】:

  • 感谢您的建议,但一开始我将 MyApp.app.globals.cmbServiceStore 定义为 null 然后当有更改时,我用给定的值更改了商店。正如我在调试中看到的那样,商店已加载,但组合框无法显示该商店。
【解决方案2】:
if(combo.itemId == "cmbServiceList") {
        MyApp.app.globals.cmbServiceStore = this.createServiceCmbStore(upContainer.getComponent('cmbServiceList').getRawValue());
        upContainer.getComponent('cmbServiceList').bindStore(MyApp.app.globals.cmbServiceStore);
    }

而不是

if(combo.itemId == "cmbServiceList") {
    MyApp.app.globals.cmbServiceStore = this.createServiceCmbStore(upContainer.getComponent('cmbServiceList').getRawValue());
}

解决了这个问题。

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 2013-08-16
    • 1970-01-01
    • 2014-05-28
    • 2012-04-18
    • 2017-11-17
    • 1970-01-01
    • 2011-09-01
    • 2019-11-19
    相关资源
    最近更新 更多