Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   dataProvider - скроллинг и изменение данных (http://www.flasher.ru/forum/showthread.php?t=153765)

Lexxx_HU 08.04.2011 16:23

dataProvider - скроллинг и изменение данных
 
Столкнулся вот с какой проблемой, имеются компоненты которые используют для вывода массивы bindable
dataProvider="{arrayRooms}"
это может быть и DataGrid и List
Вопрос вот в чем - при изменении данных массива чтобы отобразить эти изменения - делаем arrayRooms.refresh() при это происходит автоматический скрол компонента в то место где были изменения, как его отключить ? чтобы при изменения данных пользователь оставался в той позиции списка, где сейчас находится?

и попутный вопрос - в itemrender используются изображения с внешних сайтов, в некоторых ячейках списка или таблицы могут быть графические элементы, например статус активный - одно изображение, заблокирован другое, и вот если список довольно большой при скроллинге вниз вверх эти фотографии заново закачиваются (это видно в плагине для mozilla - firebug) - как можно отключить повторную закачку изображений ?

P.S. отдельную тему не стал создавать, так как проблемы очень близки друг к другу

alatar 09.04.2011 01:54

1. Судя по методу refresh() вы используете не массив, а коллекцию. Научите ваши объекты данных отправлять событие PropertyChangeEvent или вызывайте у коллекции itemUpdated(). Это решит ваши "проблемы". refresh() предназначен применения сортировки и фильтра.
Цитата:

при это происходит автоматический скрол компонента
Это не автоматический скролл. Происходит полная перестройка рендереров.
2. Кэшируйте изображения и скармливайте компонентам уже загруженные, если они были загружены ранее. Или не обращайте внимание, если сервер настроен правильно, то изображения будут взяты из кэша браузера.

Lexxx_HU 02.06.2011 18:49

параметром itemUpdated() является объект. откуда его взять если у меня изменилось всего одно значение из 20 полей ?
создавать новый объект с перечислением этих всех полей ? и изменять только одно из них, как то выглядит не разумно, не уж то нет способа попроще - изменилось одно значение извне (не пользователь изменил datagrid)

zorexundra 02.06.2011 18:58

1. Запоминайте позицию скроллера и по событию обновления itemRenderer скроллируйте к ней.
2. В этой теме затронут вопрос кэширования изображений в swf при помощи bitmapData:
http://www.flasher.ru/forum/showthread.php?t=148335

alatar 02.06.2011 19:02

Какие поля? Какое создание объекта?
Пример для itemUpdated
Код AS3:

...
var obj:Object = arrayRooms.getItemAt(5); //вместо Object свой тип
var oldValue:Object = obj.property; //вместо Object свой тип
obj.property = 20; //вместо 20 свое значение
arrayRooms.itemUpdated(obj, "property", oldValue, obj.property); //сообщаем об изменении

Добавлено через 2 минуты
Цитата:

1. Запоминайте позицию скроллера и по событию обновления itemRenderer скроллируйте к ней.
В этом нет необходимости, если не вызывать refresh()

Lexxx_HU 03.06.2011 11:17

может я чего то не понимаю но код
Код AS3:

var obj:Object = arrayRooms.getItemAt(t); //вместо Object свой тип
var oldValue:int = obj.timer_sec; //вместо Object свой тип
obj.timer_sec = oldValue-1; //вместо 20 свое значение
arrayRooms.itemUpdated(obj, "timer_sec", oldValue, obj.timer_sec); //сообщаем об изменении
trace('oldValue-'+oldValue);
trace('obj.timer_sec-'+obj.timer_sec);

c datagrid ничего не делает, данные не обновляются. при этом trace показывает то что нужно

P.S.
Есть некоторые сдвиги
если убрать itemRenderer="showSec" и добавить dataField="timer_sec"
то все прекрасно работает, как сделать чтоб с итемрендерором работало ?

itemRenderer
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"  xmlns:s="library://ns.adobe.com/flex/spark"
                paddingLeft="2" verticalAlign="middle" horizontalAlign="center" height="20" >
        <mx:Style>
                .style_gray {
                        color:#999999;
                }
                .style_black {
                        color:#000000;
                }
        </mx:Style>
        <mx:Script>
                <![CDATA[
                        override public function set data(value:Object):void {
                                super.data = value;
                                if (value != null) {
                                        var countSecCreateDelta:int = int(value.timer_sec);
                                        // если 2 серый стиль
                                        if ( int(value.table_count_players) < 3 ) {
                                                id_label_create_delta.styleName = 'style_gray';
                                        } else {
                                                id_label_create_delta.styleName = 'style_black';
                                        }
                                        // дефолтные значения
                                        if (countSecCreateDelta < 0) {
                                                id_label_create_delta.text = '00:00';
                                        } else if (countSecCreateDelta < 10) {
                                                id_label_create_delta.text = '00:0'+value.table_create_delta;
                                        } else {
                                                id_label_create_delta.text = '00:'+value.table_create_delta;
                                        }
                                        // конец условия на null
                                }
                                // конец функции
                        }
                ]]>
        </mx:Script>
        <s:Label        id="id_label_create_delta" />
</mx:HBox>



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

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