Показаны сообщения с ярлыком ExtJs. Показать все сообщения
Показаны сообщения с ярлыком ExtJs. Показать все сообщения

пятница, 5 декабря 2008 г.

ExtJs: задание класса строки таблицы

Для выделения (подсветки) всей строки в ExtJs можно переопределять метод getRowClass() у объектов класса GridView:

grid.getView().getRowClass = function(row, index) {
if (row.json.IS_ERROR == 1)
return 'row-error';
if (row.json.IS_WARNING == 1)
return 'row-warning';
}
В этом примере назначение классов выполняется на основе флагов IS_ERROR и IS_WARNING определённых в JSON, но не отображаемых в таблице. Если классы нужно назначать на основании только доступных для отображения данных - то можно использовать свойства объекта row.data.

понедельник, 1 декабря 2008 г.

ExtJs: загрузка файла с сервера с обработкой ошибок

Задача: необходимо загружать файлы с сервера. Учитывая приличный размер файлов (несколько мегабайт) желательно реализовать загрузку файлов по ссылке, без пропускания содержимого файла через JSON. Возникла сложность как, открывая файл по ссылке, быть с обработкой ошибок. Помогло открытие ссылки в iframe:
function downloadFile(url){
var stub = Ext.get('cc-download-stub');
if (!stub)
stub = Ext.get(Ext.DomHelper.append(document.body, {tag: 'iframe', cls: 'x-hidden', width:'0',
height:'0', frameBorder:0, src: 'about:blank', id: 'cc-download-stub'}));

stub.dom.src = url ; // or url + '&_dc=' + (new Date().getTime()) to prevent caching
}
В случае ошибки при обращении к файлу скрипт на сервере формирует вызов Javascript-функции из родительского окна с соответствующим сообщением:
print $cgi->header(-type => 'text/html', -charset => 'UTF-8');
print '<script type="text/javascript">',
'parent.iframeError(\''.$msg.'\');',
'</script>';

среда, 8 октября 2008 г.

Google Groups

Возникла проблема с фильтрами для одного объекта из библиотеки ExtJs. После нескольких часов изучения на практике методов, событий и свойств двух объектов зарегистрировался в Google Groups и описал свою проблему. Проверил после обеда: ответов не было, при этом появилось несколько новых постов с количеством ответов от 1 до 3. Пришлось отвечать самому. Для поиска ответа использовалась отладочная версия библиотеки. Выяснил, что для локальных данных метод ComboBox.doQuery() или очищает фильтр объекта Store для выборки всех данных, или очищает фильтр для установки нового для фильтрации по введённому значению - т.е. без особых вариантов на использование своего фильтра. Помогла проверка используемая для кэширования запросов по последнему условию.

Итоговая заплатка для использования своих фильтров выглядела так:
ComboBox.on('beforequery', function (obj){
obj.forceAll = true;
obj.combo.lastQuery = obj.query;
});
Внимание: используется недокументированное свойство ComboBox.lastQuery, работает в ExtJs версии 2.2.

P.S. Ранее для помощи в освоении ExtJs зарегистрировался в Вопросах и ответах, но после краткого знакомства с ВиО вопросы на эту тему там задавать я не стал.