2010-05-08 4 views
0

Je me demande si quelqu'un peut regarder ce code et me dire pourquoi l'appel de removeSelectedChild fonctionne lorsqu'il est appelé depuis le même document, mais renvoie l'erreur suivante lorsqu'il est appelé depuis le document enfant /composant. "ArgumentError: Erreur # 2025: le DisplayObject fourni doit être un enfant de l'appelant."Flex: La méthode ne fonctionne pas lors de l'appel parentDocument

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > 

    <mx:Accordion id="myAccordion" 
    width="100%" height="100%" 
    selectedIndex="0"> 

    <mx:Script> 
    <![CDATA[ 

     public function removeSelectedChild():void { 
      trace("before"); 
     try { 
       myAccordion.selectedChild.parent.removeChild(myAccordion.selectedChild) 
     } catch(err:ReferenceError) { 
      trace("catch") 
      } 
      trace("after"); 
     } 

    ]]> 

    </mx:Script> 

    <mx:headerRenderer> 
    <mx:Component> 
     <mx:Button click="{ parentDocument.removeSelectedChild() }" /> 
    </mx:Component> 
    </mx:headerRenderer> 

    <mx:HBox> 
    <mx:Button click="{ removeSelectedChild() }" /> 
    </mx:HBox> 

    </mx:Accordion> 

</mx:Application> 

En cliquant sur le bouton dans l'enfant produit le résultat attendu, tout en cliquant sur l'en-tête enlève l'enfant comme prévu, mais jette aussi une erreur malgré le fait qu'ils appellent tous deux exactement la même méthode.

Désolé que l'exemple est un peu artificiel, ce problème est survenu dans une vue assez compliquée, qui utilisait toutes sortes de composants personnalisés. C'était la seule façon de l'afficher de manière à ce que vous puissiez compiler rapidement et facilement sur le vrai problème sans bruit de fond.

Je tire mes cheveux sur celui-ci et j'apprécierais vraiment si quelqu'un pouvait aider. MISE À JOUR: J'ai maintenant découvert que l'exception est déclenchée après l'exécution de la méthode. Voir les instructions de trace ci-dessus. "after" est tracé avant que l'exception ne soit lancée.

Cheers,

Chris

Répondre

0

Comme vous l'avez noté, l'erreur n'est pas déclenchée par votre fonction. L'action par défaut lorsque vous cliquez sur l'en-tête d'un accordéon est d'étendre ou de contracter cet élément. Puisque vous supprimez l'élément, lorsque Flex tente de l'étendre ou de le réduire, vous obtenez une erreur.

Vous pouvez le réparer en arrêtant l'événement de faire son action par défaut:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > 

    <mx:Accordion id="myAccordion" 
        width="100%" height="100%" 
        selectedIndex="0"> 

     <mx:Script> 
      <![CDATA[ 

       public function removeSelectedChild(event:MouseEvent):void { 
        myAccordion.removeChild(myAccordion.selectedChild); 
        event.stopImmediatePropagation(); 
       } 

      ]]> 

     </mx:Script> 

     <mx:headerRenderer> 
      <mx:Component> 
       <mx:Button click="{ parentDocument.removeSelectedChild(event) }" /> 
      </mx:Component> 
     </mx:headerRenderer> 

     <mx:HBox> 
      <mx:Button click="{ removeSelectedChild(event) }" /> 
     </mx:HBox> 

    </mx:Accordion> 

</mx:Application> 
0

Pas une solution, mais peut-être une solution de contournement: pourriez-vous essayer de réécrire la méthode comme ceci:

myAccordion.selectedChild.parent.removeChild(myAccordion.selectedChild) 

si cela ne fonctionne pas, il doit y avoir un bug quelque part dans Flex.

+0

Non cela ne fonctionne pas non plus. On dirait que ça doit être un bug Flex. – ChrisInCambo

+0

Oui, il semble très étrange que vous ne puissiez pas faire 'child.parent.removeChild (child)'. – Theo

0

Utilisez "outerDocument" au lieu de "parentDocument". définit une nouvelle mini-portée.

Questions connexes