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

时间:2011-09-15 20:24:37

标签: flex actionscript-3 function filterfunction

我有一个扩展火花列表的自定义组件。

在该自定义列表中,我希望声明一个可以从主应用程序调用的公共函数,以使用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>

从我的主应用程序调用

<fx:Script>
<![CDATA[

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

]]>

没有错误,没有。 filterFunction只是没有执行...有人可以帮忙吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

  

我的问题是我有多个过滤器,我需要传递该功能   从主应用程序命名为字符串

将该功能作为一项功能传递。您的应用过滤器功能将是这样的:

    public function applyFilter(functionName:Function):void
    {
        listView.filterFunction = functionName;
        listView.refresh();
    }

然后你的列表的父容器会有这样的东西:

public function myFilter(item:Object):Boolean{

}

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

我没注意到列表组件中有过滤器功能。但是,你可以将它们公开并以同样的方式传递它们:

    

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

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

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

]]>

而且:

<fx:Script>
<![CDATA[

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

    ]]>

答案 1 :(得分:2)

使用括号表示法的完美时间。

    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();
    }

答案 2 :(得分:0)

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

    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;

无论如何,我认为你可以收集到我想说的话。您必须在类中找到函数作为属性,然后才能使用它。

您可能想要考虑的另一点是将逻辑分开。通常,当我有某种过滤器时,我会根据过滤的基础将其应用于模型或演示者中。我通常不会在视图类中过滤。