2010-07-17 144 views
2

我在Flex 4的一个这样的代码深度处理使用Flex 4

<!-- START >>> middle part: items --> 
<mx:Canvas id="itemContainer" 
      width="100%" 
      height="100%"> 
    <!-- START >>> Items Display on the page --> 
    <mx:Repeater id="richTextReapeater" 
       dataProvider="{_model.current_day.richTextNotes}"> 
     <components:RichTextNoteDisplay theNote="{richTextReapeater.currentItem}" />  
    </mx:Repeater> 
    <mx:Repeater id="postItReapeater" 
       dataProvider="{_model.current_day.positNotes}"> 
      <components:PostItNoteDisplay theNote="{postItReapeater.currentItem}" /> 
    </mx:Repeater> 
    ...... 
</mx:Canvas> 

主要是它的一个MX:帆布具有里面reapeaters为我创建了多个自定义组件。大多数这些自定义组件是这样的:

<s:SkinnableContainer xmlns:fx="http://ns.adobe.com/mxml/2009" 
          xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx" 
          x="{theNote.x}" 
          y="{theNote.y}" 
          width="{theNote.width}" 
          height="{theNote.height}" 
          depth="{theNote.depth}" 
          rotation="{theNote.rotation}" 
creationComplete="skinnablecontainer1_creationCompleteHandler(event)" > 

一切工作正常(x,y,宽度,高度,旋转),除了深度!

似乎无论数字是什么,它显示为它在父容器中呈现的顺序。 (MX:帆布)!

我想获得的是相对于彼此,mx:Canvas中的所有项目都按分配给它们的“深度”顺序显示。

我该怎么做?

回答

1

您正在使用中继器;这本质上是一个循环。

听起来好像您要求循环播放项目,但是按不同顺序处理这些项目。那是对的吗?

我的第一个建议是,你会研究如何在转发器“运行”之前按照深度对dataProvider项进行排序。

我的第二个建议是你不使用中继器。由于渲染器回收,基于列表的类将为您提供更好的性能。

如果你真的需要一次创建所有的孩子,我的第三个建议是,你转移到一个ActionScript实现,它可以让你更精确地控制事物创建的方式和时间。

每当我使用了一个中继器,我一直不高兴。


这里是lists and itemRenderers一些信息使用Flex 4

这是我会如何修改此示例使用一个列表,而不是一个中继器的粗略估计:

<!-- START >>> middle part: items --> 
    <mx:Canvas id="itemContainer" 
       width="100%" 
       height="100%"> 
     <!-- START >>> Items Display on the page --> 
     <s:List id="richTextList" 
        dataProvider="{_model.current_day.richTextNotes}" 
        itemRenderer="com.something.myComponent"> 
     </s:List> 
    </mx:Canvas> 

的itemRenderer可能是这样的:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:s="library://ns.adobe.com/flex/spark"> 
    <s:SkinnableContainer rotation="{data.rotation}" 
    creationComplete="skinnablecontainer1_creationCompleteHandler(event)" /> 
</s:ItemRenderer> 

该列表将确定宽度,渲染器的x和y位置。在大多数情况下,它也会决定身高;尽管Flex 3列表有variableRowHeight选项。

如果你想使用基于OND ATA不同的渲染器,考虑使用一个itemRendererFunction

+0

谢谢你的建议。我一直使用中继器的主要原因是因为添加/删除/更新项目到列表是很方便的。我有多个页面上的显示项目,我经常添加/删除/更新,所以我不确定如何确保每次更改该类型的ArrayCollection时它都会在屏幕上呈现?另外,如何为每种类型的物品选择特定的渲染(自定义组件)? – Tam 2010-07-17 21:33:44

+0

你说你需要的一切都可以用基于列表的类来完成。当dataProvider更新时,基于列表的类将会更新。基于列表的类可以支持自定义渲染器(AKA组件);并且您可以根据数据编写逻辑来大幅改变显示。只要你的数据和绑定你的dataProvider [就像你使用Repeater一样],数据列表类将根据需要进行更新。但是,列表类只会呈现当前在屏幕上直观显示的内容,而不需要为dataProvider中的所有内容呈现组件。这可能会导致更少的内存使用量。 – JeffryHouser 2010-07-17 22:15:16

+0

谢谢@ www.Flextras.com我认为我有这个想法,我会给它一个镜头。链接或示例代码肯定会让事情变得更容易一些。 – Tam 2010-07-17 23:11:43