Flex: компоненты, привязанные к пустой ArrayCollection во время загрузки, не отображаются должным образом при обновлении ArrayCollection - PullRequest
1 голос
/ 27 октября 2009

Я новичок в Flex и использую TileList, связанный с ArrayCollection. Коллекция массивов пуста во время загрузки, а затем обновляется в соответствии с результатами вызова HTTPService. Проблема в том, что средства визуализации элементов не отображаются должным образом, я предполагаю, потому что не было данных, когда они были впервые отображены во время загрузки. Вот упрощенный пример:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" >

  <mx:Script>
    <![CDATA[

      import mx.collections.ArrayCollection;

      [Bindable]
      public var myList1:ArrayCollection = new ArrayCollection();

      [Bindable]
      public var myList2:ArrayCollection = new ArrayCollection([{item:"foo"}, {item:"bar"}]);

      public function updateMyList():void
      {
          myList1.source = [{item:"foo"}, {item:"bar"}];
      }

    ]]>
  </mx:Script>

<mx:Button id="myButton" label="Update My List"
           click="updateMyList();"/>


  <mx:TileList dataProvider="{myList1}"
           direction="vertical"
           width="800" >

    <mx:itemRenderer>

      <mx:Component >

    <mx:Canvas backgroundColor="yellow" >
      <mx:Label text="{data.item}" width="800"  />
    </mx:Canvas>

      </mx:Component>

    </mx:itemRenderer>

  </mx:TileList>


<!-- This one renders as expected  -->

  <mx:TileList dataProvider="{myList2}"
           direction="vertical"
           width="800" >

    <mx:itemRenderer>

      <mx:Component >

    <mx:Canvas backgroundColor="yellow" >
      <mx:Label text="{data.item}" width="800"  />
    </mx:Canvas>

      </mx:Component>

    </mx:itemRenderer>

  </mx:TileList>

</mx:Application>

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

Может ли кто-нибудь объяснить, почему это происходит, или даже предложить какие-то обходные пути, чтобы избежать этого?

С уважением,

Chris

Ответы [ 2 ]

1 голос
/ 27 октября 2009

Вероятно, этот раздел вызывает проблемы:

public function updateMyList():void
          {
              myList1.source = [{item:"foo"}, {item:"bar"}];
          }

С здесь :

источник данных в ArrayCollection. Объект ArrayCollection не представлять любые изменения, которые вы делаете непосредственно к исходному массиву. Всегда используйте ICollectionView или IList методы для изменения коллекции.

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

Так что я, вероятно, изменил бы строку на:

myList1= new ArrayCollection([{item:"foo"}, {item:"bar"}]);

0 голосов
/ 27 октября 2009

http://livedocs.adobe.com/flex/3/langref/mx/controls/TileList.html Проверьте API.

Установите свойства columnWidth и rowHeight следующим образом:

  <mx:TileList dataProvider="{myList1}"
                   direction="vertical"
                   width="800" columnWidth="800" rowHeight="25">

Вероятно, есть более "правильный" способ сделать это, но это должно помочь вам начать.

...