2009-09-05 4 views
2

J'ai plusieurs composants dans lesquels je veux activer les boutons basés sur la transmission d'un nom d'utilisateur à une fonction. Je veux lier dynamiquement la propriété "enabled" sur un bouton de sorte que si l'événement "somethingChanged" se déclenche, un bouton peut être activé ou désactivé. Mais, je ne suis pas sûr d'où déclencher l'événement "somethingChanged". Il est possible que je devrais déclencher l'événement "somethingChanged" à partir de plusieurs endroits de l'application. Est-ce possible avec une fonction statique liée?Liaison d'un composant Flex à une fonction de classe

Suis-je sur le bon chemin ou y at-il une meilleure solution?

EventManager.as

public class EventManager():void 
{ 
    [Bindable(event="somethingChanged")] 
    public static function hasAccess(myVal:String):Boolean 
    { 
    } 
} 

testform1.mxml

<s:Button id="testButton1" enabled="{EventFunction.hasAccess("john")}" /> 
<s:Button id="testButton2" enabled="{EventFunction.hasAccess("mary")}" /> 
<s:Button id="testButton3" enabled="{EventFunction.hasAccess("beth")}" /> 

testform2.mxml

<s:Button id="testButton4" enabled="{EventFunction.hasAccess("tom")}" /> 
<s:Button id="testButton5" enabled="{EventFunction.hasAccess("bill")}" /> 
<s:Button id="testButton6" enabled="{EventFunction.hasAccess("jerry")}" /> 

Répondre

1

Quelque chose comme ça fonctionnerait.

package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public class EventManager extends EventDispatcher 
    { 
     [Bindable(event="somethingChanged")] 
     public var hasAccess:Boolean = true; 

     public static var instance:EventManager = new EventManager(); 

     public static function setHasAccess(hasAccess:Boolean):void 
     { 
      instance.hasAccess = hasAccess; 
      instance.dispatchEvent(new Event("somethingChanged")); 
     } 
    } 
} 

qui serait utilisé comme ceci:

<?xml version='1.0' encoding='UTF-8'?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/halo"> 

    <fx:Script> 
     <![CDATA[ 

      protected function button1_clickHandler(event:MouseEvent):void 
      { 
       EventManager.setHasAccess(false); 
      } 

     ]]> 
    </fx:Script> 

    <mx:Button click="button1_clickHandler(event)" enabled="{EventManager.instance.hasAccess}"/> 
</s:Application> 

Je ne sais pas que cette approche est bonne. Ce type de fonctionnalité serait probablement mieux servi dans une structure MVC appropriée. Ceci crée essentiellement un singleton. Pour l'implémenter comme vous le décrivez, vous voudrez probablement une sorte d'instance par utilisateur, je suppose. Cependant, vous ne serez pas capable de vous lier à une fonction statique.

+0

Cette approche fonctionnerait mais j'éviterais le motif de Singleton ici. Créez simplement une classe qui étend EventDispatcher et déclarez-la comme une variable publique sur le composant qui doit être défini. –

+0

Je suis d'accord en ce qui concerne le singleton. –

+1

Vous n'avez pas besoin de spécifier l'événement de liaison sur une propriété, juste sur un setter. – sharvey

Questions connexes