В ExtJS, как определить jsonreader для разных форматов ввода json? - PullRequest
1 голос
/ 02 августа 2011

У меня есть внешний источник, который генерирует JSON в заданном формате. Мне нужно использовать ScriptTagProxy для доступа к этим данным. Формат данных (две записи):

{
"COLUMNS":["KEDBID","EMPID","KE","SOLUTION","ATTACH_KE","ATTACH_SOLUTION"],
"DATA":[
[1,36661,"While adding a new user, if his\/her profile is missing, it could be LDAP    server issue.","Contact Mr. ABC from infra team to get user's profile corrected on server","screenshots.jpg","conacts.doc"],
[2,36661,"The error code # 123445 is trivial that may occur at particular time.","To resolve this issue, we will need to ask DBA team to refresh database. That will fix this type of errors","NA","NA"]
]
} 

Как определить jsonreader для этих данных? Как я уже видел, корень должен выглядеть так:

{ROOT: [ {field1:data1,field2:data1},{field1:data2,field2:data2}]}

пока мой JSON выглядит так:

{fieldnames:['field1','field2'],
 ROOT:[ [data1ForField1,data1ForField2],[data2ForField1,data2ForField2] ]
}

UPDATE

Добавление еще одного случая: Точно так же мы можем иметь jsonreader для;

    {"ROWCOUNT":8,
"COLUMNS":["CATID","CATEGORY"],
"DATA":{"CATID":[1,2,3,4,5,6,7,8],"CATEGORY":["Optimization","Automation","Process Improvement","Tool","Other","Another One","ThisHas'","More^!@#(){}"]}} 

, где 1 -> Оптимизация, 2 -> Автоматизация, 3 -> Улучшение процесса и т. Д.

В основном мне нужно возвращать данные из объекта запроса ColdFusion путем сериализации объекта запроса. Сериализация в CF Query может возвращать данные в двух вышеуказанных форматах.

Я все еще новичок в Ext World !! Надеюсь получить поддержку.

С наилучшими пожеланиями, Тушар Саксена


Ниже приведен код, с которым я сталкиваюсь. Данные поступают в хранилище, так как они доступны для ComBox ... но не могут читать данные, используя каждую функцию или другими способами? Так что данные в хранилище могут быть поданы только на компоненты? В другом примере я создал простейшее хранилище (ArrayStore) с привязкой к данным вручную, используя loadDATA () .. там каждая функция работала !!!

В следующем случае, если я добавлю одну запись после загрузки с использованием ADD (), каждая функция будет выполнена один раз, показывая данные, которые я только что добавил ... и что только что добавленные данные недоступны для компонентов !!! Как получилось !!!

Может быть, мне не хватает какой-то очень простой концепции, поскольку я все еще очень плохо знаком с EXT.

Был бы очень благодарен за ответ.

var proxy = new Ext.data.ScriptTagProxy({
            url: 'http://127.0.0.1:8500/extex/kebyid.cfm',
            method: 'POST'
        });

        var rec = Ext.data.Record.create([
            {name: 'EMPID', mapping: 1},
                     {name: 'KE', mapping: 2},
                     {name: 'SOLUTION', mapping: 3},
                     {name: 'ATTACH_KE', mapping: 4},
                     {name: 'ATTACH_SOLUTION', mapping: 5}
        ]);

        var myReader = new Ext.data.ArrayReader({
                    idIndex: 0,
                    root: 'DATA'
                }, rec);



        var store = new Ext.data.ArrayStore({
                 proxy: new Ext.data.HttpProxy({
                        url: '/extex/kebyid.cfm',
                            method: 'POST'
                }),

                autoSave: true,
                autoLoad: true,
                root: 'DATA',
                fields: [
                     {name: 'KEID', mapping: 0},
                     {name: 'EMPID', mapping: 1},
                     {name: 'KE', mapping: 2},
                     {name: 'SOLUTION', mapping: 3},
                     {name: 'ATTACH_KE', mapping: 4},
                     {name: 'ATTACH_SOLUTION', mapping: 5}
                ]
            });


    store.each(function(){
        alert('!!!!'); //**************NOT WORKING
    });
    var catCB = new Ext.form.ComboBox({
            fieldLabel: 'Category',
            layout:'absolute',
            x: 100,
             y: 5,
            store: store, //************* DATA IS THERE AS STORE IS PROVIDING DATA TO COMBOBOX
            emptyText:'Select Category...',
            valueField : 'KEID',
            displayField : 'KE',
            hiddenName : 'category',
            hiddenvalue : 'None', 
            mode: 'local',
            editable : false,
            lastQuery: '',
            renderTo: Ext.get("d1"),
            listeners: {

                'beforequery': function(qe){
                      qe.forceAll = true;
                }}
        });

1 Ответ

1 голос
/ 02 августа 2011

Прежде всего, вы не можете использовать выходные данные вашего сервера для scriptTagProxy.scriptTagProxy использует технологию JSONP .Таким образом, вывод должен выглядеть следующим образом:

callback({
  "COLUMNS":["KEDBID","EMPID","KE","SOLUTION","ATTACH_KE","ATTACH_SOLUTION"],
  "DATA":[
    [1,36661,"While adding a new user, if his\/her profile is missing, it could be LDAP    server issue.","Contact Mr. ABC from infra team to get user's profile corrected on server","screenshots.jpg","conacts.doc"],
    [2,36661,"The error code # 123445 is trivial that may occur at particular time.","To resolve this issue, we will need to ask DBA team to refresh database. That will fix this type of errors","NA","NA"]
  ]
});

Затем просто используйте ArrayStore в качестве магазина.По умолчанию используется ArrayReader:

var store = new Ext.data.ArrayStore({
    proxy: new Ext.data.ScriptTagProxy({
        url: 'http://example.com/get_data.php'
    }),
    root: 'DATA',
    fields: [
       'id',
       // ...,
       // ...,
       // ...
    ]
});

ОБНОВЛЕНИЕ
Я забыл, что вы используете 'DATA' в качестве корневого свойства.Добавил его для хранения конфига.

...