2009-02-11 9 views
0

J'ai donc un module en flex dans lequel j'ajoute un composant personnalisé. J'ai aussi une classe qui gère les données que je veux montrer, appelons cette classe DataHandler. Le DataHandler reçoit des données de la solution dorsale, puis commence à mettre les données ensemble pour mon module et le composant personnalisé.Reliure profonde dans Flex

Lorsque les données sont prêtes, un événement est intercepté par mon module. J'envoie les nouvelles données à mon composant.

exemple de code pour ce dans le module:

private function onDataChange(evt:Event=null):void 
{ 
    _customComponent.ItemData = _dataHandler.DataProvider; 
} 

Le _customComponent obtient alors les données:

public function set ItemData(value:ItemDataVO):void 
{ 
    _itemdata = value; 
} 

// _itemdata est une classe personnalisée nommée ItemDataVO

Maintenant, dans mon composant personnalisé Je lie simplement les données à mes composants mxml, par exemple

<mx:Label 
    text  = "Text: {_itemdata.Text}" 
    fontFamily = "Hel" 
    fontSize = "12"  
    x   = "83" 
    y   = "40" /> 

Lorsque j'obtiens de nouvelles données, l'étiquette change automatiquement.

Jusqu'ici tout va bien. Mais ce que j'ai aussi dans mon composant personnalisé est i List. Et c'est mon problème. Quand je lie les données à la liste que je fais ce qui suit:

<mx:List 
    id   = "_list" 
    dataProvider ="{_itemdata.Collection}" 
    itemRenderer = "components.renderers.CustomRenderer" /> 

// cette _itemdata.Collection est un ArrayCollection qui contient une collection d'éléments à partir d'une classe personnalisée.

La liaison ne fonctionne pas, et je reçois aussi un Varning pour chaque élément de la liste lors de l'exécution:

avertissement: incapable de se lier à la propriété « parent » sur la classe « modules :: CustomModule »

(j'ai aussi essayé, comme une solution de contournement, pour définir la itemRenderer de _list chaque fois que le ItemData est réglé. les nouvelles listData sont mis à jour alors, mais je ne vois aucune mise à jour visuelle dans la liste.)

tout le monde sait comment faire cela travail de liaison?

Cordialement Adlertz =)

+0

Etes-vous sûr que le problème est dû à cette liaison? Le message d'avertissement semble indiquer le contraire. Que se passe-t-il si vous supprimez uniquement l'attribut dataProvider de l'élément mx: List? –

+0

BTW, il serait grandement améliorer la lisibilité de vos extraits de code si vous avez adhéré aux conventions de codage flex: http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions (par exemple, start attribut et getter/setter noms avec une lettre minuscule). –

Répondre

0

Avez-vous défini la propriété de collection sur ItemDataVo être bindable ... quelque chose comme

package 
{ 
    import mx.collections.ArrayCollection; 

    public class ItemDataVo 
    { 
     [Bindable] 
     public var text : String; 

     [Bindable] 
     public var collection : ArrayCollection 
     public function ItemDataVo() 
     { 
     } 

    } 
} 

J'ai fait un exemple de travail simplifié montrant la liaison de travail sur un modèle similaire à le vôtre (bien qu'il y aura évidemment des différences) avec la liaison fonctionnant correctement tant que les propriétés de texte et de collection ont toutes deux les méta-données Bindable attachées:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:local="*" creationComplete="creationCompleteHandler(event)"> 

    <mx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 

      [Bindable] 
      protected var itemData : ItemDataVo; 

      private function creationCompleteHandler(event : FlexEvent) : void 
      { 
       generateItemData(); 
      } 

      protected function generateItemData() : void 
      { 
       itemData = new ItemDataVo(); 
       itemData.text = "New Text With Random " + Math.random() * 100; 
       itemData.collection = generateCollection(); 
      } 

      protected function generateCollection() : ArrayCollection 
      { 
       var arrayCollection : ArrayCollection = new ArrayCollection(); 
       arrayCollection.addItem("New Item With Random " + Math.random() * 100); 
       arrayCollection.addItem("New Item With Random " + Math.random() * 100); 
       arrayCollection.addItem("New Item With Random " + Math.random() * 100); 
       arrayCollection.addItem("New Item With Random " + Math.random() * 100); 
       arrayCollection.addItem("New Item With Random " + Math.random() * 100); 
       arrayCollection.addItem("New Item With Random " + Math.random() * 100); 

       return arrayCollection; 
      } 

      private function fullClickHandler(event : MouseEvent) : void 
      { 
       generateItemData(); 
      } 
      private function collectionClickHandler(event : MouseEvent) : void 
      { 
       itemData.collection = generateCollection(); 
      } 

     ]]> 
    </mx:Script> 

    <mx:VBox width="100%" height="100%"> 
     <mx:VBox> 
      <mx:Label text="{itemData.text}" /> 
      <mx:List dataProvider="{itemData.collection}" /> 
     </mx:VBox> 
     <mx:HBox> 
      <mx:Button label="UPDATE FULL ITEM DATA" click="fullClickHandler(event)"/> 
      <mx:Button label="UPDATE COLLECTION" click="collectionClickHandler(event)"/> 
     </mx:HBox> 
    </mx:VBox> 
</mx:Application> 
+0

Oui, j'ai. Et si vous ajoutez la VBox et tout son contenu dans un nouveau composant personnalisé, puis dans as3 ajoutez le composant, puis essayez de lier les données à la liste? C'est quand le problème de liaison se produit comme je le vois. Cordialement Adlertz –

+0

Quel type d'objet est stocké dans la collection? Le fait qu'un composant personnalisé soit utilisé ne devrait pas causer le problème –

0

Dans le passé, j'ai ajouté ma liste dans mon module et cela ne m'a jamais posé de problèmes de liaison. Mais oui, il semble très étrange que le composant entre les deux casse la liaison.

L'objet stocké dans la collection ressemble à ceci:

package code.converters.objects 
{ 
    public class LineupLI 
    { 
     private var _plid:int; 
     private var _lastname:String; 
     private var _firstname:String; 
     private var _shirtnumber:int; 
     private var _onpitch:Boolean; 

     private var _distance:Number; 
     private var _topspeed:Number; 

     private var _goals:int = 0; 

     private var _subin:Boolean  = false; 
     private var _subout:Boolean  = false; 

     private var _redcard:Boolean = false ; 
     private var _yellowcard:Boolean = false; 

     private var _teamid:int; 

     private var _teamlongdesc:String; 

     private var _second_increase:Number; 

     [Bindable] 
     public function get OnPitch():Boolean { return _onpitch; } 
     public function set OnPitch(value:Boolean):void { _onpitch = value; } 

     [Bindable] 
     public function get ShirtNumber():int { return _shirtnumber; } 
     public function set ShirtNumber(value:int):void { _shirtnumber = value; } 

     [Bindable] 
     public function get PlId():int { return _plid; } 
     public function set PlId(value:int):void { _plid = value; } 

     [Bindable] 
     public function get FirstName():String { return _firstname; } 
     public function set FirstName(value:String):void { _firstname = value; } 

     [Bindable] 
     public function get LastName():String { return _lastname; } 
     public function set LastName(value:String):void { _lastname = value; } 

     [Bindable] 
     public function get Distance():Number { return _distance; } 
     public function set Distance(value:Number):void { _distance = value; } 

     [Bindable] 
     public function get TopSpeed():Number { return _topspeed; } 
     public function set TopSpeed(value:Number):void { _topspeed = value; } 

     [Bindable] 
     public function get Goals():int { return _goals; } 
     public function set Goals(value:int):void { _goals = value; } 

     [Bindable] 
     public function get SubIn():Boolean { return _subin; } 
     public function set SubIn(value:Boolean):void { _subin = value; } 

     [Bindable] 
     public function get SubOut():Boolean { return _subout; }  
     public function set SubOut(value:Boolean):void { _subout = value; } 

     [Bindable] 
     public function get RedCard():Boolean { return _redcard; } 
     public function set RedCard(value:Boolean):void { _redcard = value; } 

     [Bindable] 
     public function get YellowCard():Boolean { return _yellowcard; } 
     public function set YellowCard(value:Boolean):void { _yellowcard = value; } 

     [Bindable] 
     public function get TeamId():int { return _teamid; } 
     public function set TeamId(value:int):void { _teamid = value; } 

     [Bindable] 
     public function get TeamLongDesc():String { return _teamlongdesc; } 
     public function set TeamLongDesc(value:String):void { _teamlongdesc = value; } 

     [Bindable] 
     public function get SecondIncrease():Number { return _second_increase; } 
     public function set SecondIncrease(value:Number):void { _second_increase = value; }        
    } 
} 
0

Attend ok pour moi ... Je pense qu'il pourrait y avoir quelques problèmes ici. L'un est la liaison ne fonctionne pas et le second (comme David Hanak a déclaré) étant la raison pour laquelle l'avertissement

warning: unable to bind to property 'parent' on class 'modules::CustomModule' 

est jeté ce qui ne semble pas se rapporter à l'un de vos objets. J'essaierais de résoudre ce dernier en premier et essayerais de comprendre pourquoi cela se produit. Vous pouvez constater que cela corrige le problème de liaison d'origine.

Questions connexes