2011-03-14 28 views
0

我有两个关于Flex组合框的问题。Flex combo box labelfunction

  1. 表示函数名称的字符串将从xml @运行时读取。

    var combo:ComboBox = new ComboBox(); combo.labelFunction =“functionName”;

我该如何做到这一点?

  1. 因此,要显示在组合框中的名字只能通过访问另一个DTO(称为person,然后是其名)来检索。

    var combo:ComboBox = new ComboBox(); combo.labelField =“person.firstName”;

我的类看起来是这样的,

public class Test 
{ 
    public var person:PersonDTO; 
} 

public class PersonDTO 
{ 
    public var firstName:String; 
} 

是否有可能访问使用组合框的标签字段中的任何多级文本?

回答

0

广告1)的labelFunction

调用函数时,你只知道名称作为字符串是很容易的。以下片段显示了如何执行一个属于同一类的成员的函数。如果您需要调用另一个类的函数,请使用相应的变量名替换this

private function comboBox_labelFunction(item:Object):String 
{ 
    var functionName:String = [email protected]; 
    return this[functionName](item); 
} 

广告2)的labelField

它通常无法使用 “person.firstName” 作为labelField属性。不过,你应该可以在你的labelFunction中使用它。像这样的东西应该工作...

private function comboBox_labelFunction(item:Object):String 
{ 
    var labelField:String = "person.firstName"; 
    var attributeNames:Array = labelField.split("."); 

    for each (var attributeName:String in attributeNames) 
    { 
     if (item && item.hasOwnProperty(attributeName)) 
      item = item[attributeName]; 
     else 
      return null; 
    } 

    return item; 
} 
2

您需要传递函数而不是名称。 这样做

combo.labelFunction = "functionName"; 

传递一个字符串。

我能想到的唯一工作就是为每个可能具有的功能做一个switch语句。然后用你的xml中的“case”来调用它。

switch([email protected]){ 
    case 'func1': 
     combo.labelFunction = this.func1; 
     break; 
    case 'func2': 
     combo.labelFunction = this.func2; 
     break; 
} 

它的hacky,但应该工作。