2011-07-17 43 views
2

我有這個JSON商店,但它沒有正確編碼。它的正確語法是什麼?如何從一個不尋常的JSON商店創建Ext.data.Store?

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()); 

編輯:working example

2

爲了您的例子中,你有你的數據修改,以這樣的:

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

@drfanai,如果你想使用你的數據都是一樣的,你必須創建自己的讀者 –

+0

它創建服務器端,我們只是想,如果我能」修改我的數據和js世界的解決方案是什麼? –

+0

它不應該是這樣嗎? 數據:[{ ID: 「AA」, '名': 「遠方」},{ ID: 「AB」: '名字': 「阿布哈茲」}, ... ] – Roberto

4

首先 ,在您的組合框配置中,您必須具有:store: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); }  
}); 
而當你想到你的組合框,將工作。

編輯:不是這樣的:

 
data.push({ 
    id: prop, 
    name: oldData[prop] 
    }); 
我有這樣的:
 
data.push({ 
    id: prop, 
    value: oldData[prop] 
    }); 

+0

我將代碼複製並粘貼到我的js商店,但不幸在我的組合框中顯示數據。 –

+0

您是否在您的組合框中更改store:'Language'來存儲:Ext.create('MA.store.Language')? – Zango

+0

是的我did.Did你檢查你的本地主機上?它在你身邊工作嗎? –