2009-11-12 6 views
0

creationComplete J'ai un composant simple que j'ai créé que j'instancier dans mon programme principal comme ceci:Flex instancié Object - attendre

newMessage = new MessageDetail(); 
newMessage.body.text = "Hello World"; 

Je reçois l'erreur "Impossible d'accéder à une propriété ou méthode d'un objet nul référence "sur la deuxième ligne parce que newMessage n'a pas été entièrement créé avant de frapper la deuxième ligne de code en essayant de définir le texte de mon corps" text ". Je sais que je peux créer un gestionnaire d'événement "creationComplete", mais n'y a-t-il pas une façon plus simple de le faire?

Répondre

2

Ne pas accéder à des sous-composants du tout.

Au lieu de faire des anciennes propriétés régulières sur votre composant. Demandez au composant de lier ces valeurs aux composants visuels.

Par exemple:

MyComponent.MXML:

<mxml blah blah blah> 

<script> 
    [Bindable] public var bodyText; 
</scipt> 


<mx:TextArea text="{bodyText}" /> 
</mxml> 

Dans votre code:

myComponent = new MyComponent() 
myComponent.bodyText = "Hello World!"; 

En général, je crois que les sous-composantes étant publiques par défaut était une énorme erreur dans Fléchir.

0

Je peux recommander de créer créer tous les enfants dans votre composant en redéfinissant la méthode createChildren(). Il s'assurera que tous les enfants sont instanciés. Plus here et here

public class MessageDetail() 
    { 

     // ... 
     private var body:TextArea; 
     // ... 

     protected override function createChildren():void 
     { 
      super.createChildren(); 

      body = new TextArea(); 
      addChild(body); 
     } 

EDIT:

newMessage = new MessageDetail(); 
addChild(newMessage); // During this step all children will to be initialized 
newMessage.body.text = "Hello World"; 

Merci à Michael Brewer-Davis pour commentaires

+0

Ceci est vrai mais pas pertinent - la méthode createChildren() est correcte ici. Mais il n'est pas appelé avant initialize(), c'est-à-dire, lorsque l'objet est ajouté à la liste d'affichage. –

+0

Donc, en utilisant cette méthode, il n'y a aucun moyen que je puisse vraiment utiliser la vue de conception pour voir à quoi cela va ressembler? Mon composant MessageDetail contient environ 8 composants enfants. Ce serait bien s'il y avait une fonction d'attente pour attendre le chargement d'un objet spécifié. –

+0

Mon point était que le code dans votre édition, en utilisant addChild(), aurait fonctionné même sans une méthode personnalisée createChildren(). –

Questions connexes