2

我正在使用 Adob​​e Flash Builder 4 高级版。我有 amx:DataGrid和 a s:TextInput,我正在尝试设置一个搜索框,在每次按键时过滤 DataGrid。

这个页面显示了我正在尝试做的一个近乎完美的示例,除了我将它设置在 as:TitleWindow中,它是使用 PopUpManager 弹出的。我要过滤的列表可能非常大。它是一个用户名列表,通过 PHP 从 MySQL 数据库中获取。由于它可能很大,我希望该列表在主应用程序中填充一次,然后在弹出窗口中引用,这样它就不必在每次用户打开弹出窗口时获取所有用户名。

我第一次打开弹出窗口时所有这些都可以正常工作,但是如果您关闭它并再次打开它,我会收到以下运行时错误:

Flash 运行时错误

filterFunction如果我在关闭弹出窗口之前尝试将 back 设置为 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>

尽管出现错误,该应用程序似乎仍然可以按预期工作,但我不喜欢在我的应用程序中出现错误,所以我真的很想弄清楚是什么导致了这个问题。

谢谢!

4

2 回答 2

1

原来问题出在tabChildren物业上。文档说不要在 Flex 中使用这个属性,而是使用它hasFocusableChildren。不知道为什么这个问题只在我尝试设置filterFunction.

我设置tabChildren为 false 的原因是默认的 TAB 键功能(切换焦点)不会发生,这样我就可以自己控制该行为。该hasFocusableChildren属性不起作用(或者至少,将其设置为 false 不会阻止 TAB 键切换焦点),因此我可能需要尝试另一种捕获 TAB 键事件并停止它的方法。


编辑:

对于任何感兴趣的人(即使它与原始帖子没有任何关系),解决方案是改变:

<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()">

于 2011-06-14T12:40:34.583 回答
0

我从不尝试测试您的代码(因为它也需要服务器端),但我认为您不应该将 filterFunction 设置回 null。或者,您可以将其设置为始终返回 true 的函数。

function defaultFilterFunc( item: Object ): Boolean { return true; }
于 2011-06-14T02:11:16.973 回答