试图在组合中使用JSONStore

时间:2016-10-11 16:02:29

标签: extjs combobox extjs4

在我们的应用程序中,我们有很多名称/值存储,它们是在加载时创建的,并且像这样放入 JSONStore

Ext.create("Ext.data.JsonStore", {
    data: data,
    model: 'EM.model.controlUnit.CodeList',
    storeId: "cl_" + tableId,
    sorters: [{
        sorterFn: aSorterFunction
    }],
});

该模型非常简单,如下所示:

Ext.define('EM.model.controlUnit.CodeList', {
    extend: 'Ext.data.Model',

    fields: [{
        name: 'value', type: 'int'
    }, {
        name: 'label', type: 'string'
    }, {
        name: 'description', type: 'string'
    }]
});

我认为商店是可以互换的,所以我决定在组合中使用商店(没有特殊的组合商店所以我认为JSONStore必须和 SimpleStore 一样好)。我这样得到了商店:

var msDataStore = Ext.getStore("cl_t_cl_maritalstatus");

并像这样使用商店:

{
    xtype: 'combo',
    fieldLabel: 'Marital Status',
    displayField: "label",
    valueField: "value",
    store: msDataStore
}

当我运行应用程序时,组合充满了商店中的值,但是,当我弹出组合框时,会抛出此错误:

  

ext-debug-w-comments.js:9951 Uncaught   Ext.data.proxy.Server.buildUrl():你正在使用ServerProxy但是   没有提供网址。

我不想要任何服务器代理。这些是简单的本地存储的名称值集合。

  • JSONStores可以与组合一起使用吗?
  • 如果没有。将JSONStore转换为组合可接受的最佳方法是什么?我可以砍,改变,重组商店对象。但我只想知道在进行某种漫长而毫无意义的旅程之前是否有更简单的事情可以做。

2 个答案:

答案 0 :(得分:3)

此问题与“代理”属性有关。 JsonStore的默认代理是'ajax';

proxy: {
    type  : 'ajax',
    reader: 'json',
    writer: 'json'
}

你应该用'memory'覆盖;

proxy: {
    type: 'memory'
}

你的最终商店是;

Ext.create("Ext.data.JsonStore", {
    data: data,
    model: 'EM.model.controlUnit.CodeList',
    storeId: "cl_" + tableId,
    proxy: {
        type: 'memory'
    }
    sorters: [{
        sorterFn: aSorterFunction
    }],
});

答案 1 :(得分:2)

没有URL的JsonStore是完全可以接受的,但是您必须确保在单击下拉列表时组合不会触发加载操作。这是通过在组合定义中添加配置选项queryMode:'local'

来完成的
{
    xtype: 'combo',
    fieldLabel: 'Marital Status',
    displayField: "label",
    valueField: "value",
    queryMode: 'local',
    store: msDataStore
}