Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.05.2010, 18:16
Dimitry_II вне форума Посмотреть профиль Отправить личное сообщение для Dimitry_II Найти все сообщения от Dimitry_II
  № 1  
Ответить с цитированием
Dimitry_II

Регистрация: Jan 2010
Сообщений: 211
По умолчанию Изменение поведения itemEdotor'а при изменении сериализации на строгую

Было:
получаю данные через RemoteObject - достаточно большую коллекцию сложных объектов, все НЕпримитивные объекты обозначены как Object; вставляю в DataGrid c редактированием. Выбираю нужную колонку, кликаю - появляется комбобокс с библиотечными данными, выбираю - все работает отлично.

Стало:
Понадобилась более сложная работа с получаемыми объектами, решил ввести AS-классы ([RemoteClass]), соответствующие серверным. С получением, сериализацией и типизацией проблем не возникло (проверял данные по событию result в RemoteObject), количество и названия свойств в точности соответствует серверному и точно соответствует тем объектам, которые я получал до создания своих классов. Таблица отображается, тут непорядков не обнаружено. Однако при клике на редактируемую ячейку (где должен появиться комбобокс) выскакивает эксепшн:
Код:
ReferenceError: Error #1069: Не удалось найти свойство null в myclasses.MyClass1; отсутствует значение по умолчанию.
Ошибка эта выскакивает в стандартном модуле ComboBox.as:
Код AS3:
public function set data(value:Object):void {
    var newSelectedItem:*;
    _data = value;
    if (_listData && _listData is DataGridListData) newSelectedItem = _data[DataGridListData(_listData).dataField]; //вот тут выскакивает
    else if (_listData is ListData && ListData(_listData).labelField in _data)newSelectedItem = _data[ListData(_listData).labelField];
    else newSelectedItem = _data;
    if (newSelectedItem !== undefined && !selectedItemSet) {
        selectedItem = newSelectedItem;
        selectedItemSet = false;
    }
    dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}
Контейнер комбобокса-itemEdotor'а - DataGridColumn - действительно не имеет поля dataField (не определено), так как используется labelFunction. И до введения пользовательских классов value был определен как Object и также не имел поля dataField, но ошибок не возникало; правда, еще появлялось свойство mx_internal_uid в объекте.

Я бы, конечно, мог установить поле dataField - в этом случае ошибок при выборе редактируемой ячейки не возникает, но проблемы возникают при завершении редактирования, так как данное linked свойство пользовательского объекта - непримитивное, а также объект, а синтаксис свойства dataField не позволяет указать что-то типа такого: "code.value", а при указании как "code" естественно не может записать, так как MyObject.code - это Object, а вібираемое в комбобоксе - строка.

То есть вижу, что можно поиграться и перехватывать события окончания редактирования и назначать результат в них. Однако остается загадкой, почему при смене Object на MyObject при отсутствии видимых причин возникает проблема.

Интуиция подсказывает, что, по всей видимости, если RemoteObject получает объект и не находит шаблона класса, куда его можно поместить (кому сопоставить), то создает свой объект типа Object, но с наследованием или расширением другого класса или интерфейса. Какого и как - не увидел и не нашел. Очень хотелось бы в этом разобраться, подскажите направление.

Добавлено через 19 часов 20 минут
А ларчик просто открывался ...
Для DataGridColumn обязательно надо указывать dataField и для задачи типа моей editorDataField. Просто если у отображаемого столбца аналог в объекте коллекции - Object (или пользовательский класс), то editorDataField="selectedItem". Остальное - в обработчике itemEditEnd таблицы.

Удивительный язык. Не сразу догадался, что вместо названия поля можно вставить ЛЮБОЕ свойство объекта. И код пришлось поковырять, чтобы прийти к решению.

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 10:48.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.