2009-02-04 5 views
1

Je tente d'appeler une méthode setter dans un bloc ActionScript de mon composant personnalisé à partir d'une classe ActionScript.Appel de la méthode setx mxml dans un composant personnalisé à partir d'actionscript

Je peux le faire très bien quand c'est l'application principale que je veux appeler en utilisant;

Application.application.methodName(); 

Cependant comment puis-je appeler une méthode à partir d'un composant personnalisé? Mon composant est dans mon paquet de composants et im essayant les suivantes

components.customComponent.methodName() 

mais son ne se produit pas, des idées?


une instance de mon componet personnalisée appelle la classe actionscript donc je ne veux instancier à nouveau la classe personnalisée à l'intérieur du actionscript, je veux juste appeler une méthode setter ...

d'autres idées?

Répondre

2

Vous n'avez pas besoin de rendre la méthode statique; cela serait probablement inutile, car vous voudriez que l'appel de la méthode fasse quelque chose avec l'état actuel du composant, je devine - utiliser certaines de ses données, changer son apparence, etc. Ce dont vous avez réellement besoin, c'est une référence d'objet . Comme application.Application réside en haut (ou en fait très proche du haut) de la liste d'affichage légendaire, vous devriez être en mesure d'accéder à chaque composant en commençant à ce point, puis traversing the Display List - jusqu'à ce que finalement, à l'arrivée à votre composant imbriqué, appelant sa méthode définie publiquement.

Cependant, je dois dire (avec le plus grand respect!) Que vous vous aventurez dans des eaux OO dangereuses, ici.:) La bonne façon de le faire serait vraiment de trouver un moyen de passer une référence à votre composant personnalisé à la classe ActionScript qui nécessite un accès à - par exemple, dans votre MXML:

<mx:Script> 
    <![CDATA[ 

     private function this_creationComplete(event:Event):void 
     { 
      var yourObject:YourClass = new YourClass(yourCustomComponent); 
     } 

    ]]> 
</mx:Script> 

<components:YourCustomComponent id="yourCustomComponent" /> 

. .. et puis dans votre classe ActionScript:

public class YourClass 
{ 
    private var componentReference:YourCustomComponent; 

    public function YourClass(component:YourCustomComponent) 
    { 
     this.componentReference = componentReference; 
    } 

    private function yourMethod():void 
    { 
     this.componentReference.someMethodDefinedInYourComponent(); 
    } 
} 

Une telle approche vous servirait probablement mieux. Est-ce que ça fait du sens? Je garderai un œil sur nos commentaires; poster et je ferai de mon mieux pour vous aider à le faire.

0

Référencer le composant de cette manière nécessite que la méthode soit statique.

Si vous souhaitez appeler une méthode sur l'instance du composant, attribuez-lui un ID et invoquez-la dans la vue où vous avez défini ce composant.

<!-- component declaration --> 
<comps:MyComponent id="myComp"/> 

// inside a script block 
myComp.mySetter(someObj) 

Par ailleurs, une « méthode setter » dans ActionScript est celle qui est définie en utilisant la syntaxe suivante:

public function set myProperty(varName : String) : void { ... } 

et il peut être « appelé: » comme vous définissez une propriété valeur:

myComp.mySetter = myObj; 

Dans beaucoup d'autres langues une « méthode setter » est comme toute autre méthode, sauf pour la convention de nommage. Il vaut la peine de comprendre qu'une véritable méthode de réglage dans AS3 est différente.

0

Vous devez vous assurer que vous avez une référence à une instance de ce composant à partir de laquelle vous essayez de l'appeler. Donc dans l'exemple ci-dessous vous pouvez voir que j'ai créé une instance de B dans le constructeur de la classe A. Donc maintenant j'ai une instance de B. Maintenant, je peux appeler b.someMethod()

public class A 
{ 
    public function A() 
    { 
     var b : B = new B(); 
     b.someMethod(); 
    } 
} 

public class B 
{ 
    public function B() 
    { 
    } 

    public function someMethod() : void 
    { 

    } 
} 

Vous pouvez considérer la classe A comme Application.mxml et la classe b comme votre composant personnalisé. Donc, où que vous essayiez de l'appeler, vous devez vous assurer que votre composant a été créé.

Questions connexes