#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 обрабатывается как отдельная строка в таблице, как показано ниже:
Комментарии:
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 .