Как создать Ext.data.Store из необычного магазина JSON? - PullRequest
2 голосов
/ 17 июля 2011

У меня есть этот магазин JSON, но он не закодирован правильно. Каков правильный синтаксис для этого?

Ext.define('MA.store.Language', {
extend : 'Ext.data.Store',
fields : [ {
    name : 'id'
}, {
    name : 'name'
} ],
data : [ {
    "aa" : "Afar",
    "ab" : "Abkhazian",
    "ace" : "Achinese",
    "ach" : "Acoli",
    "ada" : "Adangme",
    "ady" : "Adyghe",
    "ae" : "Avestan",
    "af" : "Afrikaans",
    "afa" : "Afro-Asiatic Language",
    "afh" : "Afrihili",
    "ain" : "Ainu",
    "ak" : "Akan"
} ]
});

Мне нужен этот магазин для такого комбинированного списка, но он не будет работать:

{
xtype : 'combo',
name : 'language',
fieldLabel : 'Language',
store : 'Language',
queryMode : 'local',
displayField : 'name',
valueField : 'id',
typeAhead : true,
forceSelection : true
}

Ответы [ 3 ]

4 голосов
/ 17 июля 2011

Во-первых, , в конфигурации комбобокса вы должны иметь: store: Ext.create ('MA.store.Language'), вместо: store: 'Language',

И во-вторых , определение вашего магазина должно выглядеть следующим образом: <pre> Ext.define('MA.store.Language', { extend : 'Ext.data.Store', fields : [ { name : 'id' }, { name : 'name' } ], data : [ { "aa" : "Afar", "ab" : "Abkhazian", "ace" : "Achinese", "ach" : "Acoli", "ada" : "Adangme", "ady" : "Adyghe", "ae" : "Avestan", "af" : "Afrikaans", "afa" : "Afro-Asiatic Language", "afh" : "Afrihili", "ain" : "Ainu", "ak" : "Akan" } ], <b> read : function() { var me = this; var oldData = me.getProxy().data[0]; var data = []; for (var prop in oldData) { if (oldData.hasOwnProperty(prop)) { data.push({ id: prop, name: oldData[prop] }); } } me.loadData(data); } </b> }); И оно будет работать так, как вы ожидаете, используя свой комбинированный список.

РЕДАКТИРОВАТЬ: вместо этого: <pre> data.push({ id: prop, name: oldData[prop] }); У меня было это: <pre> data.push({ id: prop, <b>value</b>: oldData[prop] });

4 голосов
/ 18 июля 2011

Так что вы все равно хотите использовать свой необычный JSON.В этом случае вы можете решить свою проблему, определив свой собственный читатель.Как это:

Ext.define('MA.reader.Language', {
    extend: 'Ext.data.reader.Json',
    alias: 'reader.Language',
    read: function (response) {
        var data = [];
        for (var i in response[0])
            data.push({
                id: i,
                'name': response[0][i]
            });
        return this.callParent([data]);
    }
});

Ext.define('MA.store.Language', {
    extend: 'Ext.data.Store',
    fields: [{
        name: 'id'
    }, {
        name: 'name'
    }],
    data: [{
        "aa": "Afar",
        "ab": "Abkhazian",
        "ace": "Achinese",
        "ach": "Acoli",
        "ada": "Adangme",
        "ady": "Adyghe",
        "ae": "Avestan",
        "af": "Afrikaans",
        "afa": "Afro-Asiatic Language",
        "afh": "Afrihili",
        "ain": "Ainu",
        "ak": "Akan"

    }],
    proxy: {
        type: 'memory',
        reader: {
            type: 'Language'
        }
    }
});

var store = Ext.create('MA.store.Language', {
    storeId: 'Language'
});

var cc = Ext.widget('combo', {
    xtype: 'combo',
    name: 'language',
    fieldLabel: 'Language',
    store: 'Language',
    queryMode: 'local',
    displayField: 'name',
    valueField: 'id',
    typeAhead: true,
    forceSelection: true
});

cc.render(Ext.getBody());

РЕДАКТИРОВАТЬ: рабочий пример

2 голосов
/ 17 июля 2011

Для вашего примера вы должны изменить ваши данные следующим образом:

data : [
    { id: "aa", 'name' : "Afar" },
    { id: "ab", 'name' : "Abkhazian" },
    ...
]
...