我正在使用Adobe Flash Builder 4 Premium。我有mx:DataGrid
和s:TextInput
,我正在尝试设置一个搜索框,在每次按键时过滤DataGrid。
This page显示了我正在尝试做的几乎完美的示例,除了我在s:TitleWindow
中设置它,使用PopUpManager将其设置为弹出窗口。我试图过滤的列表可能非常大。它是一个用户名列表,通过PHP从MySQL数据库中获取。由于它可能很大,我希望列表在主应用程序中填充一次,然后在弹出窗口中引用,这样每次用户打开弹出窗口时都不必获取所有用户名。
我第一次启动弹出窗口时,所有这些工作正常,但是如果你关闭它并再次启动它,我会收到运行时错误:
如果我在关闭弹出窗口之前尝试将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>
尽管出现错误,该应用程序似乎仍然按预期工作,但我不喜欢我的应用程序出错,所以我真的想弄清楚是什么导致了这个问题。
谢谢!
答案 0 :(得分: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()">
答案 1 :(得分:0)
我从不尝试测试你的代码(因为它也需要服务器端),但我认为你不应该将filterFunction设置为null。或者,您可以将其设置为始终返回true的函数。
function defaultFilterFunc( item: Object ): Boolean { return true; }