Flex -ArrayCollection-フィルター機能の追加と削除
-
27-10-2019 - |
質問
Adobe Flash Builder 4 Premiumを使用しています。私は持っています mx:DataGrid
そしてa s:TextInput
, 、そして、各キープレスのデータグリッドをフィルタリングする検索ボックスを設定しようとしています。
このページ 私がやろうとしていることのほぼ完璧な例を示していますが、私がこれを設定していることを除いて s:TitleWindow
, 、PopupManagerを使用してポップアップとして育てられます。私がフィルタリングしようとしているリストは非常に大きい場合があります。これは、PHPを介してMySQLデータベースから取得されたユーザー名のリストです。それは非常に大きくなる可能性があるため、メインアプリケーションに一度リストを入力し、ポップアップウィンドウで参照して、ユーザーがポップアップを開くたびにすべてのユーザー名を取得する必要がないようにしたいと思います。
ポップアップを初めて育てたときに、このすべてが正常に機能していますが、閉じて再び持ち上げると、このランタイムエラーが発生します。
設定しようとした場合にもこのエラーが発生します filterFunction
ポップアップを閉じる直前にヌルに戻ります。
以下のサンプルコードを参照してください:
メインアプリケーション:
<?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
財産。ドキュメントでは、このプロパティをFlexで使用するのではなく、使用することを言っています 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()">
他のヒント
私はあなたのコードをテストしようとはしません(サーバー側も必要なので)が、フィルター機能をnullに戻すべきではないと思います。あるいは、常にtrueを返す関数に設定することもできます。
function defaultFilterFunc( item: Object ): Boolean { return true; }