Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Newbie Frage zu Events bei TitleWindow
Hallo zusammen,
ich (Newbie), hab mal ne grundsätzliche Frage zum Event-Modell von Flex - im speziellen zum Umgang mit TitleWindow. In meiner Anwendung möchte und kann ich nicht so gerne mit ViewStacks arbeiten, weswegen ich beispielsweise für die Neuanlage oder auch bei Änderungen von Datensätzen auf TitleWindows zurückgegriffen habe.
Nun möchte ich beispielsweise dass ein Datagrid in der Hauptanwendung automatisch aktualisiert wird, sobald ich in dem TitleWindow (dieses habe ich als Komponente ausgelagert) auf meinen Button Save clicke und ein Datensatz in eine MySQL-Tabelle eingetragen wird (das klappt auch). Mein Datagrid wird initial über ein CreationComplete Ereignis mit allen Datensätzen aus der MySQL-Tabelle gefüllt.
Wie kann ich nun von einem TitleWindow auf meine Applikation zugreifen - geht das irgendwie mit parent und gibt es sowas wie einen refresh oder reload?? Hoffe ihr könnt damit was anfangen und mir ein wenig weiterhelfen. Sag schon mal danke im Voraus.
Wolfgang
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Ich sag schon mal danke für deine Hilfe. Ist vielleicht eine doofe Frage - aber ganz verstanden habe ich es noch nicht:
Dass ich den Event von dem TitleWindow feuere leuchtet mir noch ein, aber unklar ist mir wieso ich den EventListener auch an das TitleWindow hängen muss. Vielleicht habe ich meine Frage ja missverständlich formuliert, aber müsste nicht in der Main-Application der EventListener - bspw. an das DataGrid in der Main-Application - gehängt werden?
Kann aber auch leicht sein dass ich einfach zu doof bin um das zu kapieren?
Beiträge: 5285 Wohnort: Bernau (bei
Berlin) Registriert: Nov 2002
Einen Listener hängt man an das Objekt, welches das Event auch auslöst.
Eine Ausnahme bildet die Möglichkeit ein Event bubbeln zu lassen. Dann wird das Event in der Hierachie der Anzeigeliste, in der das Objekt liegt, weiter nach oben durchgereicht.
Dazu muss die bubbles-Eigenschaft auf true:
ActionScript:
1
this.dispatchEvent("datenWurdenVeraendert",true);
Dann kannst du bspw. in der Application einen Listener hinzufügen:
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Vielen Dank, das mit dem bubblen hab ich verstanden und so wie es aussieht gibt es wohl verschiedene Wege zum Ziel.
Mittlerweile hab ich alles in meine Main-Applikation gelegt und einen Teilerfolg erzielt (freu ;-)) - aber irgendwie wird mein DataGrid nur ab dem zweiten Click oder unregelmäßig aktualisiert, aber definitiv nicht beim ersten click auf den Save Button. Woran kann das nun liegen? Hat das etwa mit meinem RemoteObject zu tun?
So sieht der Code in der Main Applikation aus.
ActionScript:
1 2 3 4 5 6 7 8 9
private function showPopUp() : void {
var WinInsert:TitleWindow = TitleWindow(PopUpManager.createPopUp(this, Insert , true));
PopUpManager.centerPopUp(WinInsert);
WinInsert["SaveButton"].addEventListener("click", listener);
}
private function listener( event:Event ):void{
myRemote.getData();
}
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Kann mein Problem mit einem Cache zusammenhängen?
Bei meinem deleteHandler funktioniert es, d.h. das DataGrid wird nach jeder Löschung eines Datensatzes sofort aktualisiert. Der einzige Unterschied besteht darin, dass das Löschen eines Records nicht über ein TitleWindow erfolgt.
private function deleteItem():void {
if (myGrid.selectedItem){
Alert.yesLabel = "Ja";
Alert.noLabel = "Nein";
Alert.show("Are you sure you want to delete the selected record?",
"Confirm Delete", 3, this, deleteHandler);
}
}
Beiträge: 6936 Wohnort: München Registriert: Jan 2002
- Hast Du mal debuggt ob die Methode auch aufgerufen wird?
- Kommen die richtigen Daten zurück, werden aber nicht im DataGrid aktualisiert?
- Arbeitest Du mit einer ArrayCollection? Versuch mal ein refresh();Flex Freelancer || Flashhilfe @ Twitter || XING Profil
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Hallo Sebastian,
ja, ich habe geprüft ob ich in die Schleife reinlaufe - mit einem Alert Fenster - da rausch ich jedesmal rein. Es kommen auch die richtigen Daten zurück, aber es ist wie du hinterfrägst, das DataGrid wird nicht aktualisiert - zumindest nicht immer. Manchmal krieg ich nachdem ich einen Datensatz gespeichert habe keine Änderung im Datagrid zu sehen, speichere ich dann erneut einen neuen Datensatz, dann werden manchmal auch gleich die zwei neuen Datensätze angezeigt. Dabei lasse ich das TitleWindow, über welches ich den Insert in die DB vornehme, geöffnet und erkenne im Hintergrund das das DataGrid aktualisiert wird - oder eben nicht.
Nein, ich arbeite nicht mit einer ArrayCollection - ich verwende AMFPHP und arbeite mit einem RemoteObject. Als DataProvider für das Datagrid habe ich das stehen:
ActionScript:
1
dataProvider="{myRemote.getData.lastResult}"
Worauf und wie sollte ich den refresh() machen?? Was ich mal probiert habe ist ein invalidateDisplayList() auf das Datagrid, aber da hat sich auch nichts verändert.
Ich hab noch einen refresh() auf den dataProvider des DataGrid gemacht - keine Änderung.
hi,
ich würde das lastResult von myRemote.getData in eine ArrayCollection speichern. und dem grid als dataProvider diese collection übergeben... dann kannst du auch auf die collection refresh() ausführen...
ActionScript:
1 2 3 4 5
[Bindable]
private var collection : ArrayCollection;
<mx:DataGrid dataProvider="{this.collection}"/>
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Hi,
so, nun hab ich das auch probiert und das Ergebnis des RemoteObjects in eine ArrayCollection übernommen. Das Verhalten ist leider unverändert geblieben, auch nachdem ich den dataProvider refreshed habe. Ratlosigkeit wohin mein Auge reicht ....
Mein RemoteObject:
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Hi Sebastian,
bei beiden Varianten kommen gar keine Daten mehr im DataGrid an. Da Array MyData bleibt leer. Schön langsam geb ich auf - trotzdem danke für deine Mühe.
Beiträge: 21 Wohnort: Vilsheim Registriert: Jan 2010
Themenautor/in
Nochmal hi,
die Instanz habe ich jetzt außerhalb der Schleife erzeugt, leider hat sich auch dann nichts geändert.
Da ich jetzt nicht mehr weiter wusste, habe ich den Inhalt des TitleWindows aus der Komponente in einen ViewStack der Main-Application gelegt und den Code für die InsertMethode übernommen. In der Insert-Methode steht nichts anderes drin als der eigentliche Insert in die Datenbank und anschließend ein erneuter MyRemote.getdata() Aufruf. Und siehe da, das DataGrid wird auf Anhieb aktualisiert. Irgendwas scheint doch bei einem TitleWindow anders zu laufen, ich weiß aber nicht was.
Ich bin zwar mit der Lösung nicht zufrieden, aber wenigstens funktioniert sie.
12.01.12, 18:50 #Jobs Flash Freelancer für ca. 2 Wochen in München gesucht http://t.co/XpMJr5dv
10.01.12, 10:45 #PureMVC vs #RobotLegs Performance Battle. PureMVC is significantly faster than RobotLegs in nearly every respect. http://t.co/324gWRAr