Просмотр полной версии : 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 не отображается. Если его вынести за внешний репитер - задачи видны. Как с этим бороться? Или как можно сделать дабы избежать вложенности репитеров?
У меня есть вопрос и сомнение
Вопрос - почему вы не используете *List?
Сомневаюсь, что такая вложенность это хорошо.
Либо я думаю не о том List, но мне кажется List control мне не подходит, мне нужно чтобы каждая задача в списке имела чекбокс, два лебла и кнопку. Я новичек во флекс, может не догоняю чего.
На счет сомнений — я и сам не уверен в такой вложенности, но если будут другие предложения…
Почему не генерить все при помощи AS?
А вообще все работает, только у репитера должен быть dataProvider (у обоих).
<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/componentexplorer/explorer.html если что смотри тут примеры, (visual components ->Repeater control -> repeater)
Дата провайдеры я задаю во внешнем AS файле -
projectViews.dataProvider = e.tasksContent;
taskViews.dataProvider = e.tasksContent.task;
taskViews код видит, хоть он и внутри внешнего репитера, проверил.
Этот код вызывается при получении xml.
Я уже писал что если вынести вложенный репитер за пределы внешнего — все работает, то есть таски рисуются под проэктами, а внутри — нет.
Айдишники внутри репитера для красоты больше ). Нужные данные я заполняю вызывая соответствующие методы из своего класса по creationComplete, только из примера выкинул дабы не захламлять.
Скорее всего проблема в том, что когда первый репитер получил данные, то у второго репитера уже нет того самого id=taskViews.
Это по поводу того, что я писал нет смысла использовать id внутри репитера.
Для первого репитера можешь оставить, а для второго заведи массив и назнач его сразу, чтобы внутренний репитер знал откуда брать данные (ну или хмл, если у тебя из нее данные берутся) и уже при получении присваивай
<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"/>
Хорошо, тогда впопрос, возможно немного нубский.
dataProvider для проектов я назначаю по событию во внешнем AS, событие — загрузка сгенерированного xml. Хотелось бы обьявить датапровайдер для задач в том же обработчике, как это сделать?
Я попробовал обьявить в нем переменную — массив в который загрузил треды задач, но mxml код при этом его не видит. Внешний AS с обработчиком и прочим подключается по <mx:Script source="myASfile.as"/>
Обяви в своем классе паблик массив, и в приложении задай датапровайдер этот же массив.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.