【问题标题】:ExtJs 5: Combobox with memory store not display dataExtJs 5:带有内存存储的组合框不显示数据
【发布时间】:2015-03-11 13:03:21
【问题描述】:

在我的项目中,我有一个 内存存储,其中包含 combobox 的本地数据。 我通过store.loadData() 插入数据,但也尝试了store.loadRawData()。 数据在商店中,但是当我将其分配给组合框时,无法选择项目。 组合框为空

例如我有以下数据

var data = [
    {
        name: 'Tom',
        age: 20
    },
    {
        name: 'Peter',
        age: 30
    }
];

我使用内存代理和字段配置存储。

var store = Ext.create('Ext.data.Store', {
    fields: [
        'name',
        'age'
    ],
    proxy: {
        type: 'memory',
        reader: {
            type: 'json'
        }
    }
});

在我的应用程序中,我将数据加载到其中

store.loadRawData(data, false);

然后我将商店分配给一个组合框,但无法选择。

var combobox = Ext.create('Ext.form.field.ComboBox', {
    queryMode: 'local',
    typeAhead: true,
    forceSelection: true,
    valueField: 'name',
    store: store
});

但是当我遍历存储的数据并将其记录到控制台时,每个数据行都在那里。

store.each(function(record){
    console.log('name in store: %s', record.get('name'));
});

// In console:
// name in store: Tom
// name in store: Peter

我使用 ExtJs 5.0.1,可以在 Sencha Fiddle 找到一个小提琴。

我在这里错过了什么?
感谢您的每一个建议和提示。

【问题讨论】:

    标签: javascript extjs combobox extjs5


    【解决方案1】:

    您唯一的问题是缺少组合框的 displayField 属性。

    Ext.onReady(function() {
        var data = [{
            name: 'Tom',
            age: 20
        }, {
            name: 'Peter',
            age: 30
        }];
    
        var store = Ext.create('Ext.data.Store', {
            fields: ['name', 'age'],
            proxy: {
                type: 'memory',
                reader: {
                    type: 'json'
                }
            }
        });
    
        // loadRawData happens at an other place in the application
        // only here for the example
        store.loadRawData(data, false);
    
        // data is loaded successfully into store
        store.each(function(record) {
            console.log('name in store: %s', record.get('name'));
        });
    
        // combobox is empty...
        var combobox = Ext.create('Ext.form.field.ComboBox', {
            queryMode: 'local',
            typeAhead: true,
            forceSelection: true,
            displayField: 'name', // <-- Add this 
            valueField: 'name',
            renderTo: Ext.getBody(),
            store: store
        });
    });
    

    演示:https://fiddle.sencha.com/#fiddle/gbd

    【讨论】:

      【解决方案2】:

      您可以为此使用内联数据:

      Ext.onReady(function() {
          var data = [{
              name: 'Tom',
              age: 20
          }, {
              name: 'Peter',
              age: 30
          }];
      
          var store = Ext.create('Ext.data.Store', {
              fields: ['name', 'age'],
              data: data
          });
      
          // data is loaded successfully into store
          store.each(function(record) {
              console.log('name in store: %s', record.get('name'));
          });
      
          // combobox is empty...
          var combobox = Ext.create('Ext.form.field.ComboBox', {
              queryMode: 'local',
              typeAhead: true,
              forceSelection: true,
              valueField: 'name',
              renderTo: Ext.getBody(),
              store: store
          });
      });
      

      在您使用的代码中,您指定了一个 Json 阅读器,但数据变量中的数据不是 JSON 字符串。如果你想使用 JSON,你应该这样做:

      {
          "rows": [
              {
                  "name": "Tom",
                  "age": 20
              },
              {
                  "name": "Peter",
                  "age": 30
              }
          ]
      }
      

      【讨论】:

      • 是的内联数据正在工作,但我如何在运行时更改它?我必须为每次更改创建一个新商店?
      • 你想改变什么?您可以编辑商店中的每条记录。内存存储在内存中使用并在不再需要时丢失。
      • 当例如我想向我的商店添加其他记录。我是否需要使用新数据创建一个新的商店实例并将其设置为组合框?
      • 不,只是添加另一条记录:store.add({name: 'bob', age: 35});
      猜你喜欢
      • 2016-11-17
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多