1&1 Webhosting
Flashhilfe.de - Flash Community

Newbie Frage zu Events bei TitleWindow [Flash 9]

Forum > Apache Flex / Adobe AIR > Newbie Frage zu Events bei TitleWindow

 


AntwortenRegistrieren Seite1 2

 03.03.2010, 19:36 
Benutzerbild von woiferl
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
Schlagwörter: event, TitleWindow
 04.03.2010, 08:12Re1
Benutzerbild von springerFlashhilfe.de Moderator
Beiträge: 4882
Wohnort: zuhaus
Registriert: Apr 2004

hi,
ich würde im titlewindow ein event feuern:
ActionScript:
1this.dispatchEvent("datenWurdenVeraendert");


an das titlewindow hängst du dann noch einen listener:
ActionScript:
1
2
3
4
5
deinTitleWindow.addEventListener( "datenWurdenVeraendert", listener );

private function listener( event:Event ):void{
      // reload deiner daten in der main
}
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
 04.03.2010, 13:08Re2
Benutzerbild von woiferl
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?
 
nicht sichtbar bei eingeloggten Mitgliedern1&1 Webhosting
 04.03.2010, 14:43Re3
Benutzerbild von badskillFlashhilfe.de Moderator
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:
1this.dispatchEvent("datenWurdenVeraendert",true);

Dann kannst du bspw. in der Application einen Listener hinzufügen:
ActionScript:
1addEventListener( "datenWurdenVeraendert", listener );
 04.03.2010, 16:24Re4
Benutzerbild von woiferl
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();
}

Das DataGrid versorge ich über ein RemotObject.
ActionScript:
1
2
3
....
<mx:DataGrid id="myGrid" dataProvider="{myRemote.getData.lastResult}" editable="true" itemEditEnd="save(event)">
....
 04.03.2010, 19:32Re5
Benutzerbild von woiferl
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.

Ich bin verzweifelt :-((



ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
  }
}
      
private function deleteHandler(event:CloseEvent):void {
  if (event.detail==Alert.YES){
      try {           
            auswahlZeile = myGrid.selectedItem.id_aut;
       myRemote.deleteData(auswahlZeile);
       myRemote.getData();
        }
        catch (e:Error) {
            Alert.show("unbekannter Fehler");
        }
      }
}
 
nicht sichtbar bei eingeloggten Mitgliedern
 07.03.2010, 01:43Re6
Benutzerbild von SebastianFlashhilfe.de Moderator
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
 07.03.2010, 11:09Re7
Benutzerbild von woiferl
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:
1dataProvider="{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.
Geändert von woiferl am 07.03.10 um 11:17 Uhr

 07.03.2010, 12:21Re8
Benutzerbild von springerFlashhilfe.de Moderator
Beiträge: 4882
Wohnort: zuhaus
Registriert: Apr 2004

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...
 07.03.2010, 20:58Re9
Benutzerbild von woiferl
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:
ActionScript:
1
2
3
4
<mx:RemoteObject id="myRemote" destination="MyService" source="MyService" 
         endpoint="http://localhost/~admin/amfphp/gateway.php" showBusyCursor="true">
   <mx:method name="getData" result="resultHandler(event)" fault="myFaultEvent(event)" />
</mx:RemoteObject>

Und hier noch die ArrayCollection die ich jetzt als dataProvider für das DataGrid verwende:
ActionScript:
1
2
3
4
private function resultHandler(event:ResultEvent):void
{
   MyData = new ArrayCollection(ArrayUtil.toArray(event.result));
}

Und vielleicht braucht man die Funktion im PHP-Service auch noch:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
public function getData() {               $dbc=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
   
$returnValue=array();
   
$query="select * from users";
   
$result=mysqli_query($dbc,$query) or die("Error in SQL Query, please check the SQL");                       
   while(
$row=mysqli_fetch_object($result))
     { 
$tmp = new MyUserClass();
   
$tmp->id$row->id;
   
$tmp->name$row->name;
   
$tmp->city$row->city;
   
$returnValue[] = $tmp;
      }
 
mysqli_free_result($result);
 
mysqli_close($dbc);
  return 
$returnValue;
}
?>
 10.03.2010, 17:56Re10
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6936
Wohnort: München
Registriert: Jan 2002

Versuch es mal so:
ActionScript:
1
2
3
4
private function resultHandler(event:ResultEvent):void
{
  MyData.source = ArrayUtil.toArray(event.result);
}


Falls das nicht geht:
ActionScript:
1
2
3
4
5
private function resultHandler(event:ResultEvent):void
{
  MyData.source = ArrayUtil.toArray(event.result);
  MyData.refresh();
}
Flex Freelancer || Flashhilfe @ Twitter || XING Profil
 10.03.2010, 21:44Re11
Benutzerbild von woiferl
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.
 10.03.2010, 22:07Re12
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6936
Wohnort: München
Registriert: Jan 2002

MyData muss vorher außerhalb der Methode instanziert werden.
Flex Freelancer || Flashhilfe @ Twitter || XING Profil
 10.03.2010, 22:29Re13
Benutzerbild von woiferl
Beiträge: 21
Wohnort: Vilsheim
Registriert: Jan 2010

Themenautor/in

Hi Sebastian,

ich hab MyData außerhalb der Funktion vorher so angelegt:
ActionScript:
1
2
[Bindable]
private var MyData:Array;

Das sollte reichen, oder?
 12.03.2010, 16:32Re14
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6936
Wohnort: München
Registriert: Jan 2002

ArrayCollection musst du nehmen. So wie es springer zuvor geschrieben hatte.

Wichtig ist dann aber noch das Du das Object per:
ActionScript:
1MyData = new ArrayCollection();

erzeugst. Aber wie gesagt außerhalb Deines resultHandlers da der Aufruf nur einmal initial sein darf.
Flex Freelancer || Flashhilfe @ Twitter || XING Profil
 13.03.2010, 22:35Re15
Benutzerbild von woiferl
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.
 
Themen
Ähnliche Beiträge zum Thema
 
AntwortenRegistrieren Seite1 2

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.
Partner Webseiten: DesignerInAction.de   Designnation.de   Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   PSD-Tutorials.de   Tutorials.de

Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2012 Sebastian Wichmann - Flashhilfe.de