Apache flex 字符串作为as3/Flex中的函数名

Apache flex 字符串作为as3/Flex中的函数名,apache-flex,actionscript-3,function,filterfunction,Apache Flex,Actionscript 3,Function,Filterfunction,我有一个扩展spark列表的自定义组件 在这个自定义列表中,我希望声明一个公共函数,可以从主应用程序调用该函数,使用filterFunction过滤列表的结果 我的问题是我有多个过滤器,我需要以字符串形式从主应用程序传递函数名(或者通过另一种方式,我今天将学习!:-)),如下所示: 我的自定义列表 <s:List xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xm

我有一个扩展spark列表的自定义组件

在这个自定义列表中,我希望声明一个公共函数,可以从主应用程序调用该函数,使用filterFunction过滤列表的结果

我的问题是我有多个过滤器,我需要以字符串形式从主应用程序传递函数名(或者通过另一种方式,我今天将学习!:-)),如下所示:

我的自定义列表

<s:List xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" dataProvider="{listView}">

<fx:Script>
    <![CDATA[

        public function applyFilter(functionName:String):void
        {
            listView.filterFunction = functionName as Function // <-- THIS DOESN'T WORK;
            listView.refresh();
        }

        private function myFilter(obj:Object):Boolean
        {
            // Execution code
        }

        private function anotherFilter(obj:Object):Boolean
        {
            // Execution code
        }

    ]]>
</fx:Script>


好的,为了快速回答您的问题,您可能需要将字符串函数映射到过滤器函数。像这样的

    public function applyFilter(functionName:String):void
    {
        var selectedFilterFunction:Function = null;
        if( functionName == 'myFilter' )
        {
             selectedFilterFunction = this.myFilter;
        }
        else if ( functionName == 'anotherFilter' )
        .....

        listView.filterFunction = selectedFilterFunction
        listView.refresh();
    }
listView.filterFunction = this[ fiterFunctionName ] as Function;
你甚至可以通过做这样的事情来逃避

    public function applyFilter(functionName:String):void
    {
        var selectedFilterFunction:Function = null;
        if( functionName == 'myFilter' )
        {
             selectedFilterFunction = this.myFilter;
        }
        else if ( functionName == 'anotherFilter' )
        .....

        listView.filterFunction = selectedFilterFunction
        listView.refresh();
    }
listView.filterFunction = this[ fiterFunctionName ] as Function;
无论如何,我想你能领会我想说的话。您必须在类中找到函数作为属性,然后才能使用它


你可能想考虑的另一点是分离逻辑。通常,当我有某种过滤器时,我会根据过滤的基础在模型或演示者中应用它。我通常从不在视图类中进行筛选。

好的,要快速回答您的问题,您可能需要将字符串函数映射到筛选函数。像这样的

    public function applyFilter(functionName:String):void
    {
        var selectedFilterFunction:Function = null;
        if( functionName == 'myFilter' )
        {
             selectedFilterFunction = this.myFilter;
        }
        else if ( functionName == 'anotherFilter' )
        .....

        listView.filterFunction = selectedFilterFunction
        listView.refresh();
    }
listView.filterFunction = this[ fiterFunctionName ] as Function;
你甚至可以通过做这样的事情来逃避

    public function applyFilter(functionName:String):void
    {
        var selectedFilterFunction:Function = null;
        if( functionName == 'myFilter' )
        {
             selectedFilterFunction = this.myFilter;
        }
        else if ( functionName == 'anotherFilter' )
        .....

        listView.filterFunction = selectedFilterFunction
        listView.refresh();
    }
listView.filterFunction = this[ fiterFunctionName ] as Function;
无论如何,我想你能领会我想说的话。您必须在类中找到函数作为属性,然后才能使用它

你可能想考虑的另一点是分离逻辑。通常,当我有某种过滤器时,我会根据过滤的基础在模型或演示者中应用它。我通常从不在视图类中进行筛选

我的问题是我有多个过滤器,我需要传递函数 以字符串形式从主应用程序中获取名称

将函数作为函数传递。您的apply filter函数如下所示:

    public function applyFilter(functionName:Function):void
    {
        listView.filterFunction = functionName;
        listView.refresh();
    }
然后列表的父容器将具有如下内容:

public function myFilter(item:Object):Boolean{

}

private function callMyCustomListFilter():void
{
    myCustomList.applyFilter(myFilter);
}

我没有注意到列表组件中有过滤函数。但是,您可以将其公开,并以相同的方式传递:

公共函数applyFilter(函数名:字符串):void
{
listView.filterFunction=函数名为函数//
我的问题是我有多个过滤器,我需要传递函数
以字符串形式从主应用程序中获取名称

将函数作为函数传递。应用过滤器函数如下:

    public function applyFilter(functionName:Function):void
    {
        listView.filterFunction = functionName;
        listView.refresh();
    }
然后列表的父容器将具有如下内容:

public function myFilter(item:Object):Boolean{

}

private function callMyCustomListFilter():void
{
    myCustomList.applyFilter(myFilter);
}

我没有注意到列表组件中有筛选函数。但是,您可以将它们公开,并以相同的方式传递它们:

公共函数applyFilter(函数名:字符串):void
{

listView.filterFunction=functionName作为函数//使用括号表示法的最佳时机

    public function applyFilter(functionName:String):void
    {
        listView.filterFunction = this[functionName]
        listView.refresh();
    }
如果需要,还可以通过传递参数来扩展此功能

    public function applyFilter(functionName:String, arg1:String,arg2:Number):void
    {
        listView.filterFunction = this[functionName](arg1,arg2)
        listView.refresh();
    }

使用括号表示法的最佳时机

    public function applyFilter(functionName:String):void
    {
        listView.filterFunction = this[functionName]
        listView.refresh();
    }
如果需要,还可以通过传递参数来扩展此功能

    public function applyFilter(functionName:String, arg1:String,arg2:Number):void
    {
        listView.filterFunction = this[functionName](arg1,arg2)
        listView.refresh();
    }

是的。我最近发现我可以将函数作为函数传递而不执行函数。函数很棒。@www.Flextras.com谢谢你启发我,我对Flex和OPP是新手,但上帝我喜欢它。谢谢!是的。我最近发现我可以将函数作为函数传递而不执行函数。函数很棒。@www.Flextras.com th谢谢你对我的启发,我是Flex和OPP的新手,但天啊,我喜欢它。谢谢!谢谢你的提示。另外,我不知道当只调用函数名时如何传递额外的参数,就像使用filterFunction时一样。:-)谢谢你的提示。另外,当只调用函数名时,我不知道如何传递额外的参数,l就像使用filterFunction时一样。:-)