2010-05-21 5 views
1

Je vois quelque chose de bizarre dans mon code actionScriptL'affectation flex/actioncript échoue?

J'ai deux classes foo et bar, bar extends foo. Dans une classe de modèle, j'ai une variable membre foo, j'attribue un objet barre à la variable foo. Mais après l'affectation, la variable foo est nulle.

[Bindable] public var f:foo; 
public function someFunc(arr:ArrayCollection):void { 
    if(arr.length > 0) { 
    var tempBar:bar = arr.getItemAt(0) as bar; 
    if(tempBar != null) { 
     tempBar.someProp++; 
     f = tempBar; 
     // f is now null 
    } 
    } 
} 

Des idées sur ce que je pourrais faire de mal?

EDIT Voici le code exact:

[Bindable] public var selectedCustomerJob:IDSCustomer; 

    public function selectedJobByIdCallback(evt:Event):void 
    { 
    var temp:IDSDTOArrayCollection = evt.currentTarget as IDSDTOArrayCollection; 
    if(null != temp && temp.length > 0) 
    { 
    selectedCustomerJob = IDSJob(temp.getItemAt(0));; 
    trace(" selectedCustomerJob: " + flash.utils.getQualifiedClassName(selectedCustomerJob)); 
    trace("  jobToSelect type: " + flash.utils.getQualifiedClassName(temp.getItemAt(0))); 
    trace("jobToSelect super class: " + flash.utils.getQualifiedSuperclassName(temp.getItemAt(0))); 
    } 
    } 

c'est la sortie de trace:

selectedCustomerJob: null

type jobToSelect: com.intuit.sb.cdm.v2 :: IDSJob

jobToSelect super classe: com.intuit.sb.cdm.v2 :: IDSCustomer

Répondre

0

La diffusion à l'aide du mot-clé as renvoie null en cas d'échec. Dans ce cas, le premier élément de la collection de tableaux ne peut pas être un objet de type Bar comme vous le souhaitez; ce pourrait être un Foo ou autre chose. Vous pouvez convertir un objet de sous-classe en classe de base, mais pas dans l'autre sens. Utilisez la syntaxe des parenthèses pour le cast - elle lancera une exception si la conversion échoue et vous pouvez ainsi déterminer le type de arr.getItemAt(0).

//Change 
var tempBar:Bar = arr.getItemAt(0) as Bar; 

//to 
var tempBar:Bar = Bar(arr.getItemAt(0)); 

pour vous assurer que le premier élément de la collection de tableau est en effet une instance Bar (et non Foo ou autre chose).

Sinon, vous pouvez trouver le type en utilisant

trace(flash.utils.getQualifiedClassName(arr.getItemAt(0))); 

if(tempBar != null) { 
    tempBar.someProp++; 
    f = tempBar; 
    // f is now null 
} 

Soit dit en passant, je crois que le code affiché n'est pas le code exact que vous avez exécuté parce que pour f être null, tempBar devrait être null lorsque vous l'attribuez à f. Dans ce cas, le code if ne doit pas être exécuté car vous recherchez null dans if. Même s'il entre dans le bloc if, il lancera une erreur de pointeur NULL (# 1009) dans la première ligne où vous essayez d'incrémenter tempBar.someProp