2009-01-15 55 views
7

我想要设置启用基于具有一个或多个参数的函数的返回值的按钮上的属性。我怎样才能做到这一点?我可以将Flex组件属性绑定到一个函数吗?

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

回答

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

或内联:

<mx:Button 
enabled = "{(function(arg:Object):Boolean{ ... })(this.myVariable)}" 
> 
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

但是,在我的参数传递给函数isUserAllowed?我想在试图设置enabled属性时动态地调用该函数。 – SkunkSpinner 2009-01-15 01:50:34

+0

试试这个,我更新了它。 – ForYourOwnGood 2009-01-15 01:54:40

+0

该变量将成为全局变量,不需要将其传递给该函数。 – ForYourOwnGood 2009-01-15 19:39:47

2

下面是我在类似的情况下做了几次:

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

这样,当可绑定_username的变化,它会触发一个变更通知。由于标签正在监听_username更改(即使它只是另一个函数的参数),因此将重新评估enabled属性。

10

According to the Flex docs,只要属性是可绑定的,你可以简单地做到这一点(我已经包含了两个额外的按钮来演示):

<?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> 

没有currentUser标记为[绑定],虽然,它赢得没有工作。另一种方法,如果你想更直接地绑定到函数(这也表示在文档中),可以让函数响应当前用户发生更改时发送的事件,如下所示:

<?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> 

所以有几种方法。国际海事组织,第二个看起来似乎更合适,但第一个没有错。祝你好运!

相关问题