как показать вложенные данные JSON / extjs4? - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть функция, которая возвращает 7 значений, я использовал кортеж, чтобы вернуть их, так как они не имеют одинаковый тип тогда я сэрелизирую это так что я могу прочитать мой результат json в моем скрипте js, и я могу получить к нему доступ через ItemN

взгляните на код:

 public JArray getJsonData( )
    {             

        //my queries here//  

        var vl = new List<Tuple<string, string,  string, int, int, double, string >>();

        vl.Add(new Tuple<string, string,  string,int, int, double, string>
             (item.Date , item.Adress,  name, item.login, pwd, role, id));                
        }

        JArray o = JArray.FromObject(vl);

        return o;          
    }

мой магазин extjs4:

var myStore2 = new Ext.data.JsonStore({

fields: ['Item1', 'Item2', 'Item3', 'Item4', 'Item5', 'Item6', 'Item7'] ,

data: []
});

проблема в том, что теперь мне нужно вернуть еще один элемент, который сделает их 8 элементов в моем кортеже так что я получаю эту забавную ошибку

the eight element of an eight tuple must be a tuple

поэтому я добавляю восемь элементов в виде кортежа, как и было запрошено.

проблема в том, что теперь я получаю этот формат json: (обратите внимание на 'Rest' в конце)

{Item1:"27-09-2011",Item2:"LA",Item3:"armance",Item4:"astrocybernaute",Item5:"P@ssw0rd",Item6:"Admin",Item7,Rest : {Item1 : 26 }}

проблема в том, что я не знаю, как получить к нему доступ в моем магазине extjs4. Item8 конечно не работает, Rest не работает, item1 тоже не работает !!

есть идеи, плз?

спасибо за ваше время

РЕДАКТИРОВАТЬ это мой новый магазин после предложения Мэтта Грира

Ext.define('MyModel', {
extends: 'Ext.data.Model',
fields: [
        { name: 'Item1' },
        { name: 'Item2' },
        { name: 'Item3' },
        { name: 'Item4' },
        { name: 'Item5' },
        { name: 'Item6' },
        { name: 'Item7' },
        { name: 'Item8', mapping: 'Rest.Item1' }
]
 });

 var myStore2 = new Ext.data.JsonStore({
 model: 'MyModel',
 proxy: {
     type: 'ajax',
     url: '',
     autoLoad :true,
     reader: {
         type: 'json'
             } 
        }
 });

но все равно не работает

РЕШЕНИЕ Я хочу отметить, что Store.loadData не учитывает отображение полей

Проблема в том, что команда sencha изменила поведение loadData, И это не то, что задокументировано таким понятным способом.

Добавьте следующее в базу кода (над кодом приложения, но ниже ext-all.js):

Ext.override(Ext.data.Store, {
loadDataViaReader : function(data, append) {
    var me      = this,
        result  = me.proxy.reader.read(data),
        records = result.records;

    me.loadRecords(records, { addRecords: append });
    me.fireEvent('load', me, result.records, true);
}            
});

затем используйте:

mystore2.loadDataViaReader(data)

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Ваше решение запускается, когда мы использовали метод loadData, и когда используемый прокси - Memory прокси.

На самом деле, кажется, что EXTJS не может отображатьсяданные, когда его прокси памяти .но когда это прокси Ajaxs, он может сопоставить данные и поля .

Примеры с прокси памяти

var fields = [
            {name: 'id', mapping: 'id'},
            {name: 'code', mapping: 'code'},
            {name: 'code', mapping: 'exercice'},
            {name: 'code', mapping: 'code'},
            {name: 'typeDocument', mapping: 'typeDocument'},
            {name: 'utilisateur', mapping: 'editionJobs[0].utilisateur'},
            {name: 'dateCreation', mapping: 'editionJobs[0].dateCreation'},
            {name: 'jobId', mapping: 'editionJobs[0].id'},
            {name: 'avenant', mapping: 'editionJobs[0].avenant'},
            {name: 'etat', mapping: 'editionJobs[0].etat'}
        ];

        var data = [];


        store = new Ext.data.Store({
            fields: fields,
            proxy: {
                type: 'memory',
                reader: {
                    type: 'json',
                    root: 'listDossier'
                }
            },
            listeners: {
                load: function(store, records, options) {
                    store.fireEvent('datachanged', store);
                }
            }
        });

Ext.getCmp('listeEditionDossierGridPanel').getStore().loadDataViaReader(listDossier); // OK, thx for the method ;)
    Ext.getCmp('listeEditionDossierGridPanel').getStore().loadData(listDossier); // Not ok

Другие примеры с прокси Ajax:

var fields = [
                {name: 'code', mapping : 'code'},
                {name: 'avis', mapping : 'demande.avis'},
                {name: 'commentaire', mapping : 'demande.commentaire'},
                {name: 'id', mapping: 'demande.id'}
            ];

store = new Ext.data.Store({
                    fields: fields,
                    autoLoad: true,
                    proxy: {
                        type: 'ajax',
                        extraParams: {jsonRequest:JSON.stringify(valeurs)},
                        url : 'chargerDossiersEligibles.do',
                        reader: {
                            type: 'json',
                            root: 'dossiersEligibles'
                        }
                    }
                }); 

В этом случае все в порядке, и данные могут отображаться.

Приветствия

Бенуа

1 голос
/ 29 сентября 2011

Я не уверен, откуда исходит ошибка Tuple.октеты поддерживаются .NET, как показано здесь

Дайте этому попытку

var myTuple = Tuple.Create(3,4,5,8,12,4,12,99);

myTuple должен быть восьмикратным восьмеркой.

НоЕсли вы по-прежнему получаете эту ошибку, и вы должны обойти ее в Ext, вы можете использовать отображения.Вам нужно определить модель, и в полях модели использовать отображение, чтобы получить это последнее значение:

Ext.define('MyModel', {
    extends: 'Ext.data.Model',
    fields: [
            { name: 'field1' },
            // fields 2 through 7
            { name: 'field8', mapping: 'Rest.Item1' }
    ]
 });

 var myStore = new Ext.data.JsonStore({
    model: 'MyModel',
    // ...
  });

На самом деле я никогда не пробовал определять поля прямо в магазине, я предполагаю, что Ext создает модельавтоматически для вас.Так что вы, вероятно, могли бы сделать сопоставление прямо в магазине.

...