Строка как имя функции в as3 / Flex - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть пользовательский компонент, который расширяет список искр.

Внутри этого пользовательского списка я хочу объявить публичную функцию, которую можно вызывать из основного приложения для фильтрации результатов списка с помощьюfilterFunction.

Моя проблема в том, что у меня несколько фильтров, и Мне нужно передать имя функции из основного приложения в виде строки (Или другим способом, который я изучу сегодня! :-) *

<fx:Script>
<![CDATA[

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

]]>

Нет ошибок, ничего.Функция фильтра просто не выполняется ... Кто-нибудь может помочь?Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Моя проблема в том, что у меня есть несколько фильтров, и мне нужно передать функцию имя из основного приложения в виде строки

Передать функцию как функцию. Ваша функция применения фильтра будет выглядеть примерно так:

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

    ]]>
2 голосов
/ 16 сентября 2011

Идеальное время для использования скобочных обозначений.

    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();
    }
0 голосов
/ 16 сентября 2011

Хорошо, чтобы быстро ответить на ваш вопрос, вам, вероятно, придется сопоставить ваши строковые функции с вашими функциями фильтра. Как то так.

    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;

В любом случае я думаю, что вы можете понять, что я пытаюсь сказать. Вы должны найти функцию в своем классе как свойство, а затем вы можете использовать ее.

Еще один момент, который вы можете рассмотреть, это выделение этой логики. Обычно, когда у меня есть какой-то фильтр, я применяю его в модели или в презентере в зависимости от фильтра. Я вообще никогда не фильтрую в классе представления.

...