2011-07-17 3 views
2

У меня есть этот магазин JSON, но он неправильно закодирован. Каков правильный синтаксис?Как создать Ext.data.Store из необычного магазина 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 
} 

ответ

4

Так что вы хотите использовать необычный 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()); 

EDIT: working example

2

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

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

@drfanai, если вы хотите использовать ваши данные все равно, вы должны создать свой собственный ридер –

+0

Он создан на стороне сервера и давайте предположим, что, если я могу» t изменить мои данные и что такое решение в мире js? –

+0

Разве это не должно быть так? данные: [ {идентификатор: "аа", 'имя': "Издалека"}, { идентификатор: "аб": 'имя': "абхазский"}, ... ] – Roberto

4

Во-первых , в вашей конфигурации combobox вы должны: магазин: Ext.create ('MA.store.Language'), вместо: магазин: «Язык»,

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

 
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" 
} ], 
 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); }  
}); 
И он будет работать, как вы ожидаете с ComboBox.

EDIT: вместо этого:

 
data.push({ 
    id: prop, 
    name: oldData[prop] 
    }); 
Я это:
 
data.push({ 
    id: prop, 
    value: oldData[prop] 
    }); 

+0

Я скопировал и вставил ваш код в свой js-магазин, но никаких данных пока нет в моем списке. –

+0

Вы изменили хранилище: «Язык» для хранения: Ext.create ('MA.store.Language') в вашей конфигурации combobox? – Zango

+0

да, я сделал. Вы проверили его на своем локальном хосте? Он работает на вашей стороне? –

Смежные вопросы