2010-07-17 4 views
1

J'ai été un peu bloqué en essayant d'organiser des données et de les lier à un répéteur dans une de mes applications. Ce que j'ai fait au début, c'était de sauvegarder un tableau de tableaux, de sorte que j'aurais pu accéder à n'importe quelle valeur très facilement. Mais ensuite j'ai réalisé que j'avais besoin de les lier à un répéteur, donc j'ai dû passer à une collection de tableaux Array. Mais les problèmes de liaison n'ont pas été résolus, car il existe toujours des tableaux (non liés) dans ArrayCollection. Alors qu'est-ce que je peux faire??Binding ArrayCollections of Arrays

Ci-dessous un exemple de ce que je veux faire:

<mx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     [Bindable] public var arr:ArrayCollection = new ArrayCollection(
      [[    {v:"1", s:"f"}, {v:"1", s:"p"}, {v:"1", s:"c"}, {v:"1", s:"q"} 
      ], [ 
       {v:"1", s:"f"}, {v:"1", s:"p"}, {v:"1", s:"c"}, {v:"1", s:"q"} 
      ]] 
     ); 
     protected function button1_clickHandler(event:MouseEvent):void 
     { 
      trace(arr.getItemAt(0).length); 
      arr.getItemAt(0).splice(0, 1); 
      trace(arr.getItemAt(0).length); 
     } 

    ]]> 
</mx:Script> 
<mx:HBox> 


<mx:Repeater id="rep" dataProvider="{arr.getItemAt(0)}"> 
    <mx:Label text="{rep.currentItem.v}" /> 
</mx:Repeater> 
    <mx:Button label="del" click="button1_clickHandler(event)" /> 
</mx:HBox> 

les traces montrent que la taille tableau des changements, mais le répéteur ne met pas à jour. Une idée? Quelle est la meilleure pratique?

Répondre

1

La liaison met à jour une destination lorsque la source change. Dans les objets complexes - tels qu'un tableau - cette source est un pointeur vers un autre emplacement de mémoire. Dans cette situation, vous ne changez pas la source; seul l'élément sur lequel pointe la source. Et donc la liaison n'aura aucun effet. Cela dit, les répéteurs sont des bêtes inhabituelles et je vous suggère de ne pas en utiliser un. Utilisez une classe basée sur une liste, telle qu'une liste. Ce sera moins performant que l'utilisation d'un répéteur, grâce au recyclage des moteurs de rendu.

À l'intérieur de la classe basée sur la liste; votre dataProvider est transformé en ListCollectionView; et il écoute à son tour l'événement CollectionChange de votre fournisseur de données pour modifier les éléments affichés lorsque les éléments du fournisseur de données changent. Vous n'avez pas ce code lorsque vous utilisez un répéteur.

+0

très clair! Je vous remercie! J'éviterai autant de répéteurs que possible –