Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Repeater вложенный в repeater (http://www.flasher.ru/forum/showthread.php?t=130057)

Elisium 16.09.2009 20:30

Repeater вложенный в repeater
 
Прошу помощи сообщества с отображением контента во Flex 3
Вот такой интерфейс простенького таск менеджера с разбивкой на проэкты. Проэкты выделены в отдельные панельки. Код панелек с задачами:
Код:

<mx:Repeater id="projectViews">       
                        <mx:Panel id="projectViewName" width="100%">
                                <mx:Repeater id="taskViews">
                                        <mx:HBox id="singleTaskView" width="100%" paddingTop="10">
                                                <mx:CheckBox/>
                                                <mx:Label id="singleTaskName" />
                                                <mx:Label id="singleTaskDesc" />
                                                <mx:Button label="Edit" />
                                        </mx:HBox>
                                </mx:Repeater>
                                <mx:HBox>
                                        <mx:Label text="Finished project?"/>
                                        <mx:CheckBox />
                                        <mx:Button label="Edit project"/>
                                </mx:HBox>
                        </mx:Panel>
                </mx:Repeater>

Проблема в том что вложенный repeater не отображается. Если его вынести за внешний репитер - задачи видны. Как с этим бороться? Или как можно сделать дабы избежать вложенности репитеров?

GBee 16.09.2009 22:47

У меня есть вопрос и сомнение
Вопрос - почему вы не используете *List?
Сомневаюсь, что такая вложенность это хорошо.

Elisium 17.09.2009 16:25

Либо я думаю не о том List, но мне кажется List control мне не подходит, мне нужно чтобы каждая задача в списке имела чекбокс, два лебла и кнопку. Я новичек во флекс, может не догоняю чего.

На счет сомнений — я и сам не уверен в такой вложенности, но если будут другие предложения…

yorlin 17.09.2009 17:54

Почему не генерить все при помощи AS?

А вообще все работает, только у репитера должен быть dataProvider (у обоих).

Код AS3:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
        <![CDATA[
                [Bindable]
                private var dp:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9];   
                [Bindable]
                private var ds:Array = [1, 2, 3, 4, 5,];   
 
        ]]>
</mx:Script>
<mx:Panel width="100%" height="100%">
        <mx:Repeater id="projectViews" dataProvider="{dp}">       
                        <mx:Panel id="projectViewName" width="100%">
                                <mx:Repeater id="taskViews" dataProvider="{ds}">
                                        <mx:HBox id="singleTaskView" width="100%" paddingTop="10">
                                                <mx:CheckBox/>
                                                <mx:Label id="singleTaskName" />
                                                <mx:Label id="singleTaskDesc" />
                                                <mx:Button label="Edit" />
                                        </mx:HBox>
                                </mx:Repeater>
                                <mx:HBox>
                                        <mx:Label text="Finished project?"/>
                                        <mx:CheckBox />
                                        <mx:Button label="Edit project"/>
                                </mx:HBox>
                        </mx:Panel>
                </mx:Repeater>
 </mx:Panel>
</mx:Application>

И еще, лучше айдишники внутри репитера не задавать, все равно по ним к элементам внутри репитера не обратишься.

http://examples.adobe.com/flex3/comp.../explorer.html если что смотри тут примеры, (visual components ->Repeater control -> repeater)

Elisium 17.09.2009 18:31

Дата провайдеры я задаю во внешнем AS файле -

Код:

projectViews.dataProvider = e.tasksContent;
taskViews.dataProvider = e.tasksContent.task;

taskViews код видит, хоть он и внутри внешнего репитера, проверил.

Этот код вызывается при получении xml.
Я уже писал что если вынести вложенный репитер за пределы внешнего — все работает, то есть таски рисуются под проэктами, а внутри — нет.
Айдишники внутри репитера для красоты больше ). Нужные данные я заполняю вызывая соответствующие методы из своего класса по creationComplete, только из примера выкинул дабы не захламлять.

yorlin 17.09.2009 19:21

Скорее всего проблема в том, что когда первый репитер получил данные, то у второго репитера уже нет того самого id=taskViews.
Это по поводу того, что я писал нет смысла использовать id внутри репитера.

Для первого репитера можешь оставить, а для второго заведи массив и назнач его сразу, чтобы внутренний репитер знал откуда брать данные (ну или хмл, если у тебя из нее данные берутся) и уже при получении присваивай

Код AS3:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
        <![CDATA[
                private var dp:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
                [Bindable]
                private var ds:Array = new Array();   
                private function add():void
                {
                        ds = [1, 2, 3, 4, 5];
                        projectViews.dataProvider = dp;
                }
        ]]>
</mx:Script>
<mx:Panel width="100%" height="100%">
        <mx:Repeater id="projectViews">       
                        <mx:Panel id="projectViewName" width="100%">
                                <mx:Repeater id="taskViews" dataProvider="{ds}">
                                        <mx:HBox id="singleTaskView" width="100%" paddingTop="10">
                                                <mx:CheckBox/>
                                                <mx:Label id="singleTaskName" />
                                                <mx:Label id="singleTaskDesc" />
                                                <mx:Button label="Edit" />
                                        </mx:HBox>
                                </mx:Repeater>
                                <mx:HBox>
                                        <mx:Label text="Finished project?"/>
                                        <mx:CheckBox />
                                        <mx:Button label="Edit project"/>
                                </mx:HBox>
                        </mx:Panel>
                </mx:Repeater>
 </mx:Panel>
 <mx:Button click="add()" label="sdfsdf"/>


Elisium 17.09.2009 19:36

Хорошо, тогда впопрос, возможно немного нубский.
dataProvider для проектов я назначаю по событию во внешнем AS, событие — загрузка сгенерированного xml. Хотелось бы обьявить датапровайдер для задач в том же обработчике, как это сделать?
Я попробовал обьявить в нем переменную — массив в который загрузил треды задач, но mxml код при этом его не видит. Внешний AS с обработчиком и прочим подключается по <mx:Script source="myASfile.as"/>

yorlin 17.09.2009 19:55

Обяви в своем классе паблик массив, и в приложении задай датапровайдер этот же массив.


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

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