Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Изменение поведения itemEdotor'а при изменении сериализации на строгую (http://www.flasher.ru/forum/showthread.php?t=140460)

Dimitry_II 30.05.2010 18:16

Изменение поведения 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, время: 18:36.

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