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