2011-06-08 2 views
0

J'ai:Flex/AS3: liaison de données via une propriété referrée

classe A: avec la propriété "data: ArrayCollection". C'est ma source de données (fournisseur de données) et a des bitmaps.

La classe B: possède une instance de A (appelée "Ainst") et appelle la méthode suivante: C.init (Ainst.data). Pour passer le fournisseur de données à l'objet C.

La classe C: a une référence du fournisseur de données "data" (à cause de la méthode "init"). Il montre le arrayCollection en images comme: Image.source = data.getItemAt (0). Mais C ne met jamais à jour ses images, c'est-à-dire que la liaison de données ne fonctionne pas avec ce schéma. J'ai mis [Bindable] meta-tag dans toutes les propriétés et même les classes.

classe A:

public class A{ [Bindable]public var data:ArrayCollection; } 

classe B:

public class B{ [Bindable]public var Ainst:A; public var Cinst:C; public function init(){ Cinst = new C(); Cinst.init(A.data) } } 

classe C: Un menu d'image avec 3 éléments (bitmaps)

  <s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*" 
        horizontalAlign="center" 
        paddingTop="10" 
        paddingBottom="10" 
        gap="10"> 


      <fx:Script> 
        <![CDATA[ 
    [Bindable] public var _images:ArrayCollection; 
    public function init(images:ArrayCollection):void{ 

        _images = images; 
} 
     ]]> 
      </fx:Script> 
      <ms:Image id="PreviousButton" smoothBitmapContent="true" width="55" height="55" source="@Embed(source='/../figures/upArrow.png')"/> 
       <ms:Image id="TopItem" smoothBitmapContent="true" maintainAspectRatio="true" x="12.5" source="{_images.getItemAt(0)}" /> 
       <ms:Image id="MiddleItem" smoothBitmapContent="true" maintainAspectRatio="true" x="12.5" source="{_images.getItemAt(1)}"/> 
       <ms:Image id="BottomItem" smoothBitmapContent="true" maintainAspectRatio="true" x="12.5" source="{_images.getItemAt(3)}"/><!-- getItemAt(2).image --> 
       <ms:Image id="NextButton" smoothBitmapContent="true" width="55" height="55" source="@Embed(source='/../figures/downArrow.png')"/> 
      </s:VGroup> 

Toute pensée? Merci.

+1

Veuillez fournir le code pour comprendre les détails. – Constantiner

+0

ok, je vous écris. – Manel

+0

Quel langage de programmation avez-vous utilisé avant ActionScript? – Constantiner

Répondre

1

Votre problème est que la fonction getItemAt (_images.getItemAt (0)) n'est PAS lisible.

+0

non, non. Regardez ceci: "Cependant, l'expression de liaison de données myAC.getItemAt (0) est déclenchée quand un élément de tableau change.Par conséquent, le contrôle text2 Text est mis à jour lorsque vous cliquez sur button1, tandis que text1 ne l'est pas. source d'une expression de liaison de données, vous devez utiliser la méthode ArrayCollection.getItemAt() dans l'expression de liaison. "De: http://livedocs.adobe.com/flex/3/html/help.html?content = databinding_4.html – Manel

0

Jetez un oeil à votre classe A:

public class A{ 
    [Bindable] 
    public var data:ArrayCollection; 
} 

La propriété data ici est pas statique. Donc, il est lié à l'instance de A mais pas A lui-même. Maintenant, jetez un oeil à constructeur de B:

public function init(){ 
    Cinst = new C(); 
    Cinst.init(A.data); 
} 

Et sa déclaration sur le terrain:

[Bindable] 
public var Ainst:A; 

Comme vous pouvez le voir dans une ligne

Cinst.init(A.data); 

vous faites référence data comme statique propriété. Vous devez utiliser:

public function init(){ 
    Cinst = new C(); 
    Cinst.init(Ainst.data); 
} 

à la place.

Et veuillez garder ActionScript naming and coding conventions. Placez les instructions dans une ligne distincte et démarrez les identifiants avec une lettre minuscule. Cela permet de lire votre code plus facilement.

+0

Merci pour votre temps mais ce code a été donné en pseudo. Donc ce n'est pas le problème. Je pense que le problème est que je ne peux pas obtenir l'événement de liaison lorsque le tableau change. – Manel

+0

@Manel, arrête d'utiliser le pseudo code et montre le vrai? Quoi que vous fassiez, cela semble trop compliqué. –

+0

ok, désolé, mais les classes originales sont vraiment grandes ... J'ai trouvé la solution et je vous donnerai toutes une explication plus tard. Il était lié au clonage Bitmap lorsque vous mettez à jour un ArrayCollection – Manel

Questions connexes