PDA

Просмотр полной версии : как бы хранить нестатическую переменную в imageRenderer?


chabapok
23.09.2009, 01:45
у меня в таблице интерактивные элементы, которые меняют своё состояние, генерируют события и тд.

я обнаружил, что все переменные в моем imageRenderer -- как бы статические. Ну, то есть если я например меняю currentState какой-то ячейки, а данных в талбице много, то когда листаешь таблицу ухватившись мышкой за скроллбар, то измененный currentState ячейки попадает в другие, вновь выводящиеся, ячейки.
На уже выведенные, пока они показываются на экране, не влияет - он их как бы отрендерил и "бросил"


Вобщем, все переменные, даже не статические ведут себя как статические. Ну или как
будто imagRenderer -- это один экземпляр. По всей видимости, именно так и есть. Когда он ячейку отрендерил - все ок, но как только он начинает рендерить новую то переменные используются от предыдущей.

переменных data.* мне не хватает. И хранить свои внутренние данные в области data.* не хочется - у меня там просто обьекты лежат, которые определенным образом в другие массивы добавляются и лишние данные будут мешать.

insected
23.09.2009, 11:22
Вы наверное имеете ввиду itemRenderer. ItemRender не должен хранить никакого состояния. Он должен брать входные данные, обрабатывать их и отображать. Все ваши проблемы именно от этого. В общих словах нужно делать так:
1. Получили объект data;
2. Проверили какие нибудь условия;
3. Если выполнились условия отобразили как-то хитро;
4. Если нет, то вернули все переменные и т.д. в начальное состояние.
Вот хорошие статьи на эту тему (4 части): http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html

wvxvw
23.09.2009, 11:50
Фишка в том, что сам по себе itemRenderer хранит состояние. Т.е. например, всякие комбо-боксы или чекбоксы которые в нем используются будут оставаться в том состянии, в котором их удалили из дисплей листа. А всякие контролы основаные на ListBase пытаются не создавать новые рендереры, а кешировать старые и их использовать по-новой, например, при скролле. Ну, хотя это и может не очень красиво, но приходится всю такую служебную информацию тоже хранить в data, потому что любое другое решение все равно хуже :)

chabapok
23.09.2009, 11:55
да, конечно itemRenderer!

дада. Именно на сайта адоба писали где-то, что можно работать с currentState в itemRenderer.
Там даже примеры были. Только у них у примерах currentState менялся при событиях mouseOver и mouseOut, а они возникают когда ячейка на экране. Хитринькие, я так тоже могу.

а у меня там все сложней. так в двух словах--- при нажатии на элемент он генерирует событие с bubles=true, это событие ловится слушателям, который повешен на всю таблицу. Слушатель отправляет на сервер команду, и определенным образом перезасовывает в другие массивы объект event.target.data
и меняет event.target.currentState. Определенным образом -- это значит, что он копии делает его (mx.utils.objectUtil.copy)

я могу добавить какую-то переменную в структуру dataProvider, от которого будет зависеть currentState, но я очень не хочу это делать -- в других массивах эта копия не нужна как бы.

Наверное, придется удалять из объекта поле с определенным именем, перед тем, как засовывать его в другие массивы.

Добавлено через 1 минуту
Т.е. например, всякие комбо-боксы или чекбоксы которые в нем используются. О! я придумал! чекбокс невидимый, который хранит currentState