2009-01-15 13 views
7

Quiero configurar la propiedad habilitada en un botón según el valor de retorno de una función que tiene uno o más parámetros. ¿Cómo puedo hacer esto?¿Puedo vincular una propiedad del componente Flex a una función?

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

Respuesta

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

o en línea:

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

No veo el sentido de pasar la variable como un parámetro a la función, ya que es global. – ForYourOwnGood

+3

Si el parámetro no se menciona en la línea "habilitada", el enlace no se activará cuando el valor cambie; el botón no tendría forma de saber que debería volver a evaluar la condición "habilitada". –

+1

A pesar de que funciona, este enfoque todavía se siente como un gran error para mí personalmente; parece mucho más apropiado vincularse a la función de forma explícita, en lugar de hacerlo de manera incidental a través de una variable pública "pasada" por ella. Práctica extraña. ¡Pero a cada cual lo suyo! –

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

Pero ¿por dónde pase en el parámetro de la función isUserAllowed? Quiero llamar a la función de forma dinámica cuando intenta establecer la propiedad habilitada. – SkunkSpinner

+0

intente esto, lo actualicé. – ForYourOwnGood

+0

La variable va a ser una variable global, no hay necesidad de pasarla a la función. – ForYourOwnGood

2

Esto es lo que he hecho un par de 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()" /> 

esta manera, cuando los Bindable _username cambios, que dispararán una notificación de cambio. Como la etiqueta está escuchando cambios en _username (incluso si es simplemente un parámetro de otra función), se volverá a evaluar la propiedad enabled.

10

According to the Flex docs, siempre y cuando la propiedad es capaz de unirse, puede simplemente 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 marcados [Bindable], sin embargo, se ganó no funciona

Otra forma de hacerlo, si quisiera enlazar 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 despache 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> 

Así que hay un par de maneras. OMI, el segundo parece de alguna manera más apropiado, pero definitivamente no hay nada malo con el primero. ¡Buena suerte!

+0

+1 Opción 2 todo el camino! Aunque no es una respuesta directa a la pregunta, un enfoque mucho mejor. – Edyn

Cuestiones relacionadas