flex actionscript-3 mxml

¿Puedo vincular una propiedad del componente Flex a una función?



actionscript-3 mxml (4)

Esto es lo que he hecho algunas 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 forma, cuando el Bindable _username cambie, lanzará una notificación de cambio. Dado que la etiqueta está escuchando _username de _username cambia (incluso si es simplemente un parámetro para otra función), la propiedad enabled se volverá a evaluar.

Quiero establecer la propiedad habilitada en un botón en función del 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()" />


De acuerdo con los documentos Flex , siempre que la propiedad sea vinculable, 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 currentUser 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íes cuando el usuario actual cambie, 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 formas. OMI, el segundo parece de alguna manera más apropiado, pero definitivamente no hay nada malo con el primero. ¡Buena suerte!


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

o en línea:

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


<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()"/>