Pregunta

Quiero establecer la propiedad enabled en un botón basado en el valor de retorno de una función que tiene uno o más parámetros. ¿Cómo puedo hacer esto?

private function isUserAllowed (userName:Boolean):Boolean {
   if (userName == 'Tom')
      return true;
   if (userName == 'Bill')
      return false;
}

<mx:Button label="Create PO" id="createPOButton"
enabled="<I want to call isUserAllowed ('Bill') or isUserAllowed ('Tom') here>"
click="createPOButton_Click()" />
¿Fue útil?

Solución

<mx:Button
enabled = "{this.myFunction(this.myVariable)}"
>

o en línea:

<mx:Button
enabled = "{(function(arg:Object):Boolean{ ... })(this.myVariable)}"
>

Otros consejos

Según los documentos de Flex , siempre que la propiedad sea enlazable, simplemente puede hacer esto (he incluido los dos botones adicionales para demostrar):

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

    <mx:Script>
        <![CDATA[

            [Bindable]
            private var currentUser:String = "Bill";

            private function isUserAllowed(user:String):Boolean
            {
                if (user == "Bill")
                {
                    return true;
                }

                return false;
            }

        ]]>
    </mx:Script>

    <mx:VBox>
        <mx:Button label="My Button" enabled="{isUserAllowed(currentUser)}" />
        <mx:HBox>
            <mx:Button label="Try Tom" click="{currentUser = 'Tom'}" />
            <mx:Button label="Try Bill" click="{currentUser = 'Bill'}" />
        </mx:HBox>
    </mx:VBox>

</mx:Application>

Sin el usuario actual marcado [Bindable], sin embargo, no funcionará.

Otra forma de hacerlo, si quisieras vincular más literalmente a la función (esto también se expresa en los documentos), sería hacer que la función responda a un evento que envías cuando el usuario actual cambia, así:

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

    <mx:Script>
        <![CDATA[

            private var _currentUser:String = "Bill";

            public function set currentUser(value:String):void
            {
                if (_currentUser != value)
                {
                    _currentUser = value;
                    dispatchEvent(new Event("userChanged"));
                }
            }           

            [Bindable(event="userChanged")]
            private function isUserEnabled():Boolean
            {
                if (_currentUser == "Bill")
                {
                    return true;
                }

                return false;
            }

        ]]>
    </mx:Script>

    <mx:VBox>
        <mx:Button label="My Button" enabled="{isUserEnabled()}" />
        <mx:HBox>
            <mx:Button label="Try Tom" click="{currentUser = 'Tom'}" />
            <mx:Button label="Try Bill" click="{currentUser = 'Bill'}" />
        </mx:HBox>
    </mx:VBox>

</mx:Application>

Entonces hay un par de maneras. En mi opinión, el segundo parece más apropiado, pero definitivamente no hay nada malo con el primero. ¡Buena suerte!

Esto es lo que he hecho varias veces en circunstancias similares:

<mx:Script>
<![CDATA[

    [Bindable] var _username : String;

    private function isUserAllowed (userName:Boolean):Boolean {
        if (userName == 'Tom')
            return true;
        if (userName == 'Bill')
            return false;
    }

]]>
</mx:Script>

<mx:Button label="Create PO"
    id="createPOButton"
    enabled="{isUserAllowed(_username)}"
    click="createPOButton_Click()" />

De esta manera, cuando cambie el _username enlazable, se activará una notificación de cambio. Dado que la etiqueta está escuchando los cambios de _username (incluso si es simplemente un parámetro para otra función), la propiedad habilitada será reevaluada.

<mx:Script>
    <![CDATA[
        [Bindable]
        private var userName : String = "Tom"; // or whatever ...
        [Bindable]
        private var userAllowed : Boolean;

        private function isUserAllowed ():Boolean {
           if (userName == 'Tom')
             return false;
           if (userName == 'Bill')
              return false;
           return false;
        }
    ]]>
</mx:Script>

    <mx:Button label="Create PO" id="createPOButton" enabled="{userAllowed}" addedToStage="isUserAllowed()"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top