Frage

Ich verwende Adobe Flash Builder 4 Premium. Ich habe ein mx:DataGrid und ein s:TextInput, und ich versuche ein Suchfeld einzurichten, das das DataGrid für jeden Tastendruck filtert.

Diese Seite zeigt ein nahezu perfektes Beispiel für das, was ich versuche zu tun, außer dass ich dies in einem festlegen möchte s:TitleWindow, das als Popup mit dem PopupManager erzogen wird. Die Liste, die ich versuche zu filtern, kann sehr groß sein. Es handelt sich um eine Liste von Benutzernamen, die aus einer MySQL -Datenbank über PHP abgerufen wurden. Da es so groß sein kann, möchte ich, dass die Liste einmal in der Hauptanwendung besiedelt und dann im Popup -Fenster verwiesen wird, damit nicht jedes Mal, wenn der Benutzer das Popup öffnet, alle Benutzernamen abrufen muss.

Ich habe all das zum ersten Mal gut funktionieren, wenn Sie das Popup ansprechen, aber wenn Sie es schließen und es wieder ansprechen, bekomme ich diesen Laufzeitfehler:

Flash runtime error

Ich erhalte auch diesen Fehler, wenn ich versuche, das festzulegen filterFunction Zurück zu Null, kurz bevor er das Popup schließt.

Siehe Beispielcode unten:

Hauptanwendung:

<?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>



Aufpoppen:

<?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>

Die App scheint trotz des Fehlers immer noch wie erwartet zu funktionieren, aber ich bin kein Fan von Fehlern in meiner App, daher möchte ich wirklich herausfinden, was dieses Problem verursacht.

Vielen Dank!

War es hilfreich?

Lösung

Es stellt sich heraus, dass das Problem mit dem war tabChildren Eigentum. In der Dokumentation heißt es, diese Eigenschaft nicht in Flex zu verwenden, sondern zu verwenden hasFocusableChildren stattdessen. Ich bin mir nicht sicher, warum sich dieses Problem erst gezeigt hat, als ich versuchte, das zu setzen filterFunction.

Der Grund, warum ich festgelegt habe tabChildren Falsch war so, dass die Standard -Taste -Funktionalität (Switching Focus) nicht stattfinden würde, damit ich dieses Verhalten selbst kontrollieren kann. Das hasFocusableChildren Die Eigenschaft funktioniert nicht (oder zumindest verhindert, dass die Registerkarte den Fokus nicht veraltet), daher muss ich möglicherweise ein anderes Mittel zum Erfassen des TAB -Schlüsselereignisses ausprobieren und stoppen.


BEARBEITEN:

Für alle interessiert sind (obwohl es nichts mit dem ursprünglichen Beitrag zu tun hat), bestand die Lösung darin, sich zu ändern:

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

zu:

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

Andere Tipps

Ich versuche nie, Ihren Code zu testen (da er auch serverseitig sanft), aber ich denke, Sie sollten die Filterfunktion nicht auf Null zurücksetzen. Alternativ können Sie es auf eine Funktion einstellen, die immer wahr zurückgibt.

function defaultFilterFunc( item: Object ): Boolean { return true; }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top