Не удается загрузить данные хранилища в EXTJS Simplestore с помощью JavaScript

#javascript #extjs

#javascript #extjs

Вопрос:

Я пытаюсь повторно загрузить данные в хранилище, которое в дальнейшем используется GridPanel. Мой код выглядит следующим образом:

 Ext.onReady(function(){

    myData =     [
        ['document','listsk','123','','','rat'],
        ['hiiiii','himself','rest','','','lap']
    ];

    // create the data store
    store = new Ext.data.SimpleStore({
        fields: [
            {name: 'cat'},
            {name: 'desc'},
            {name: 'edcsId'},
            {name: 'transformedEDCSUrl'},
            {name: 'transformedFormatsUrl'},
            {name: 'lineNotes'}
        ]
    });
    store.loadData(myData);

    // create the Grid
    grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
           {header: "<b>Category</b>",  sortable: true, dataIndex: 'cat'},
           {header: "<b>Description or Document Title</b>", sortable: true,  dataIndex: 'desc'},
           {header: "<b>EDCS ID #</b>", sortable: true, renderer: renderEDCSUrl, dataIndex: 'edcsId'}
           {header: "<b>URLs to Formats</b>", renderer: renderFormatsUrl},
           {id: 'lineNotes', header: "<b>Line Notes</b>", sortable: true, dataIndex: 'lineNotes'}
        ],
        viewConfig: { 
            forceFit: true
        },
        autoExpandColumn: 'lineNotes',
        stripeRows: true,
        collapsible: true
    })

    reload = function refreshGrid(data){
        store.loadData(data);
    }
})
  

Переменная mydata, видимая Firebug, равна:

 [
    ['document','listsk','123','','','rat'],
    ['hiiiii','himself','rest','','','lap']
]
  

И переменная data в функции javascript refreshGrid также одинакова:

 [
    ['document','listsk','123','','','rat'],
    ['hiiiii','himself','rest','','','lap']
]
  

Я вызываю функцию refreshGrid следующим образом:

 function load(response) {  
    reload(response.substring(response.indexOf('myData')   9, 
           response.indexOf('function renderABC') - 2));
}
  

Для меня это похоже на проблему с синтаксическим анализом JSON, поскольку данные поступают нормально из серверной части. Какой лучший способ проанализировать строку JSON, поступающую из серверной части. Поведение при вызове javascript store.loadData заключается в том, что каждый символ в переменной data обрабатывается как отдельная строка в таблице, как показано ниже:

Проблема с ExtJS

Комментарии:

1. Поскольку ваш вопрос касается проблем на стороне клиента с хранилищем и сеткой, я предлагаю вам удалить все ссылки на стороне сервера ( outBuf.append("..."); ) и вместо rowDataString.toString() показать, каков результат. Просто чтобы было легче понять и ответить на ваш вопрос 🙂

2. Вы не показали нам, как ваш grid настроен. У вас есть ColumnModel определенная конфигурация, соответствующая вашим хранилищам fields ? Насколько я знаю, сетке необходимо явно указать, как обрабатывать данные в хранилище.

3. Я определил columnmodel как показано в коде редактирования выше. Но все равно каждый символ обрабатывается как отдельная строка в строковой переменной javascript «data»

4. Если я удалю средства визуализации из columnModel, приведенный выше код (редакция # 4) будет хорошо работать для меня.

Ответ №1:

Похоже, вы предоставляете массив строк в хранилище вместо массива массивов, как ожидается.

В результате store обрабатывает каждое значение массива (фактически строки) как массив. Как только строки поддерживают ссылки по индексу (по крайней мере, в браузерах, отличных от IE), вы получаете описанное поведение.

Комментарии:

1. Итак, есть ли какой-либо способ, с помощью которого я могу использовать строковую переменную для эмуляции поведения: myData = [ [‘document’,’listsk’,’123′,»,»,’ rat’], [‘hiiiiii’, ‘himself’, ‘rest’,»,»»,’lap’] ];

2. Нет. Решение состоит в том, чтобы начать использовать массивы массивов, как и предполагалось авторами ExtJS, вместо массивов строк.

3. На данный момент я добился того, чего хотел, используя функцию eval в Javascript. Спросит клиента, согласен ли он использовать некоторую библиотеку javascript для преобразования строки в JSON в Javascript.

Ответ №2:

Для всех, кто сталкивается с этой проблемой, быстрым выходом является функция eval, а в противном случае используйте какую-нибудь библиотеку для JSON.

Комментарии:

1. Вы уже используете такую библиотеку. ExtJS имеет встроенные методы Ext.decode и Ext.encode. Никогда не используйте eval .