Вопрос

Я использую Adobe Flash Builder 4 Premium. у меня есть mx:DataGrid и s:TextInput, и я пытаюсь настроить поле поиска, которое фильтрует DataGrid на каждом нажатии клавиши.

Эта страница показывает почти прекрасный пример того, что я пытаюсь сделать, за исключением того, что я настраиваю это в s:TitleWindow, который воспитывается как всплывающее окно с использованием Popupmanager. Список, который я пытаюсь фильтровать, может быть очень большим. Это список имен пользователей, извлекаемый из базы данных MySQL через PHP. Поскольку он может быть таким большим, я хочу, чтобы список был заполнен один раз в основном приложении, а затем упоминается во всплывающем окне, чтобы он не приходился приносить все имена пользователей каждый раз, когда пользователь открывает всплывающее окно.

У меня есть все это нормально, впервые вы поднимаете всплывающее окно, но если вы закроете его и воспользуетесь его снова, я получаю эту ошибку выполнения:

Flash runtime error

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

См. Пример кода ниже:

Основное приложение:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Script>
        <![CDATA[
            import mx.collections.*;
            import mx.managers.PopUpManager;

            [Bindable] public var allMembersList:ArrayCollection;

            private function openPopup():void
            {
                var popupInstance:popup = PopUpManager.createPopUp(this as DisplayObject, popup, true) as popup;
                PopUpManager.centerPopUp(popupInstance);
            }
        ]]>
    </fx:Script>
    <s:Button label="Open Popup" click="openPopup()"/>
</s:Application>



Выскакивать:

<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:model="services.model.*"
               tabChildren="false"
               close="close()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.core.FlexGlobals;
            import mx.managers.PopUpManager;

            private function getUsers(startsWith:String = ""):void
            {
                if (FlexGlobals.topLevelApplication.allMembersList == null)
                {
                    FlexGlobals.topLevelApplication.allMembersList = new ArrayCollection();
                    getUsersResult.token = php.getUsers();
                }

                FlexGlobals.topLevelApplication.allMembersList.filterFunction = function(item:Object):Boolean
                {
                    return item.username.match(new RegExp("^"+ startsWith, "i"));
                };
                FlexGlobals.topLevelApplication.allMembersList.refresh();
                grdMemberList.dataProvider = FlexGlobals.topLevelApplication.allMembersList;
            }

            private function getUsersResultHandler():void
            {
                var users:Object = getUsersResult.lastResult;
                for each (var user:Object in users)
                    FlexGlobals.topLevelApplication.allMembersList.addItem({"username":user.username});
            }

            private function close():void
            {
                FlexGlobals.topLevelApplication.allMembersList.filterFunction = null;
                FlexGlobals.topLevelApplication.allMembersList.refresh();
                PopUpManager.removePopUp(this);
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <model:MODEL id="php" fault="{Alert.show('There was a PHP error!\nPlease note the steps taken to produce this error and call support.\n\nError Message: '+ event.fault.faultDetail, 'Error');}" showBusyCursor="false"/>
        <s:CallResponder id="getUsersResult" result="getUsersResultHandler()"/>
    </fx:Declarations>

    <mx:DataGrid id="grdMemberList" creationComplete="getUsers()">
        <mx:columns>
            <mx:DataGridColumn headerText="Member List" dataField="username"/>
        </mx:columns>
    </mx:DataGrid>
    <s:TextInput id="txtUsername" keyUp="{ if (event.charCode != 13 && event.charCode != 0) getUsers(txtUsername.text); }"/>
</s:TitleWindow>

Приложение по -прежнему работает, как и ожидалось, несмотря на ошибку, но я не фанат ошибок в моем приложении, поэтому я действительно хотел бы выяснить, что вызывает эту проблему.

Спасибо!

Это было полезно?

Решение

Оказывается, проблема была с tabChildren имущество. В документации говорится не использовать это свойство в гибке, а для использования hasFocusableChildren вместо. Не уверен, почему эта проблема проявилась только после того, как я пытался установить filterFunction.

Причина, по которой я установил tabChildren Для FALSE было так, чтобы функциональность ключа вкладки по умолчанию (переключение фокуса) не имела место, чтобы я сам контролировал это поведение. А hasFocusableChildren Свойство не работает (или, по крайней мере, установление его на false не останавливает клавишу вкладки от переключения фокусировки), поэтому мне может потребоваться попробовать еще одно средство захвата события клавиши вкладки и его остановки.


РЕДАКТИРОВАТЬ:

Для тех, кто заинтересован (хотя это на самом деле не имеет никакого отношения к первоначальному сообщению), решение было изменить:

<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:model="services.model.*"
               width="1000"
               height="550"
               tabChildren="false"
               close="close()">

к:

<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:model="services.model.*"
               width="1000"
               height="550"
               keyFocusChange="{ event.preventDefault(); }"
               close="close()">

Другие советы

Я никогда не пытаюсь проверить ваш код (потому что он также нуждается в серверной стороне), но я думаю, что вам не следует возвращать FilterFunction обратно в NULL. В качестве альтернативы, вы можете установить его функцию, которая всегда возвращает True.

function defaultFilterFunc( item: Object ): Boolean { return true; }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top