Глубина обработки с Flex 4 - PullRequest
2 голосов
/ 18 июля 2010

У меня есть код во 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: Canvas, который содержит внутри себя повторяющиеся объекты для нескольких пользовательских компонентов, которые я создал. Большинство этих пользовательских компонентов выглядят так:

   <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: Canvas)

!

Что я хочу достичь, так это то, что по отношению друг к другу все элементы в mx: Canvas отображаются в порядке присвоенной им «глубины».

Как мне это сделать?

1 Ответ

1 голос
/ 18 июля 2010

Вы используете ретранслятор; который, по сути, петля.

Звучит так, будто вы просите перебирать предметы, но обрабатывать их в другом порядке. Это верно?

Моей первой рекомендацией было бы найти способы сортировки элементов dataProvider по глубине, прежде чем ретранслятор «запустится».

Моя вторая рекомендация - не использовать ретранслятор. Класс на основе списка даст вам лучшую производительность благодаря переработке рендерера.

Если вам действительно нужно создать все дочерние элементы одновременно, моя третья рекомендация - перейти к реализации ActionScript, которая даст вам гораздо более детальный контроль над тем, как и когда создаются вещи.

Каждый раз, когда я использовал ретранслятор, я был недоволен.


Вот некоторая информация о списках и 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

...