2

Adobe Flash Builder 4 Premium を使用しています。と があり、mx:DataGridキーs:TextInputを押すたびに DataGrid をフィルタリングする検索ボックスを設定しようとしています。

このページs:TitleWindowは、PopUpManager を使用してポップアップとして表示される でこれを設定していることを除いて、私がやろうとしていることのほぼ完璧な例を示しています。フィルタリングしようとしているリストは非常に大きくなる可能性があります。これは、PHP を介して MySQL データベースから取得されたユーザー名のリストです。非常に大きくなる可能性があるため、ユーザーがポップアップを開くたびにすべてのユーザー名を取得する必要がないように、リストをメイン アプリケーションで一度入力してからポップアップ ウィンドウで参照する必要があります。

初めてポップアップを表示したときはすべて正常に機能していますが、ポップアップを閉じて再度表示すると、次のランタイム エラーが発生します。

フラッシュ ランタイム エラー

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

falseに設定tabChildrenした理由は、デフォルトの 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 に答える