Temat: Przekazanie danych z TitleWindow

Witam

Jestem początkujący we Flexie i mam pewien problem, którego w żaden sposób nie mogę rozwiązać.

Nie bardzo wiem jak przekazać dane z PopUpa (TitleWindow) po wciśnięciu np. Buttona.
W internecie znalazłem jak to zrobić, ale wszystkie tutoriale które udałó mi się znaleźć dotyczą PopUpa wygenerowanego bezpośrednio z mx:Application do którego właśnie są zwracane dane.
Ja mam troszke inny układ, tj. w Application mam TileList który generuje liste korzystając z itemrenderera. PopUpa wywołuje z wygenerowanego elementu tej listy. Po wciśnięciu Buttona w tym PopUpie chciałbym przekazać dane bezpośrednio do Application.

Jest na to jakaś rada??
Proszę jakiekolwiek wskazówki.Ireneusz Grrr edytował(a) ten post dnia 05.08.10 o godzinie 12:42
Karol Dulęba

Karol Dulęba Programista

Temat: Przekazanie danych z TitleWindow

Najlepiej stwórz własne zdarzenie (tzn zdarzenie ma być dla Appliaction) i zrób jego dispatch w popupie, takie zdarzenie powinno się przepropagować do application gdzie je złapiesz i obsłużysz (w zdarzeniu możesz np. przesłać dane które cię interesują).
Tak mi się przynajmniej zdaje, chyba bardzo nie pokręciłemKarol Dulęba edytował(a) ten post dnia 05.08.10 o godzinie 13:25
Stanislaw Żółkiewski

Stanislaw Żółkiewski Looking for an
excellent job

Temat: Przekazanie danych z TitleWindow

Kolega Karol dobrze mówi :)

W metodzie w TitleWindow wywołaj event (najlepiej stwórz wsłasny)


twButton.addEventListener(MouseEvent.CLICK, function (e:MouseEvent):void {

var myEvent:Event = new Event("CATCH_MY_EVENT", true);
dispatchEvent(myEvent);
});




Event przebombelkuje się w górę, aż do samej aplikacji, a tam:


addEventListener("CATCH_MY_EVENT", function(e:Event):void {
trace ("Cap za ogonek!")
});
Stanislaw Żółkiewski edytował(a) ten post dnia 05.08.10 o godzinie 13:59

Temat: Przekazanie danych z TitleWindow

Dzięki za informacje, przynajmniej wiem w którym kierunku szukać.

Nie bardzo jednak rozumiem zasadę działania dispatchEvent i addEventListener.
A w oficjalnym podręczniku jest poplątanie z pokręceniem :/

Narazie próbuje znaleźć jakiś przykład w internecie.Ireneusz Grrr edytował(a) ten post dnia 05.08.10 o godzinie 18:53

Temat: Przekazanie danych z TitleWindow

OK, kod w TitleWindow wygląda tak:
public var prod:Produkt;

private function createListener():void{
myButton.addEventListener(MouseEvent.CLICK, klikniecie);
}

private function klikniecie(event:MouseEvent):void{
var myEvent:Event = new Event("CATCH_MY_EVENT", true);
dispatchEvent(myEvent);
}


Co do Application nie mam pomysłu jak to ugryźć.
Dalej nie wiem jak odebrać dane ze zmiennej "prod", nie wspominając o wywołaniu funkcji :/
Nie bardzo umiem zastosować ten kod:
addEventListener("CATCH_MY_EVENT", function(e:Event):void {
trace ("Cap za ogonek!")
});
Jarek Szczepański

Jarek Szczepański Flash Platform
Developer

Temat: Przekazanie danych z TitleWindow

Hej,
1. czemu definiujesz listener dla przycisku w kodzie AS? nie lepiej dać:
<mx:Button click="klikniecie()" />
?

2. dziwne to trochę dla mnie bo od jakiegoś czasu nie korzystałem z "czystego" Flexa (bez frameworków), ale żeby przechwycić event z popupa musisz listener dla swojego eventu dać dla "systemManager", czyli:
systemManager.addEventListener("CATCH_MY_EVENT", zrobCos);

(umieszczanie funkcji "inline" w listenerach nie jest dobrą praktyką...)

3. jednak takim eventem nie przeniesiesz żadnej informacji. Musisz stworzyć nową klasę rozszerzającą Event, np:

package
{
import flash.events.Event;
public class MyEvent extends Event
{
public static const MY_CUSTOM_EVENT:String = "myCustomEvent";

public var prod:Produkt;

public function MyEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}

i wtedy (listener najlepiej dodać w metodzie odpalanej na "creationComplete" dla Application):

systemManager.addEventListener(MyEvent.MY_CUSTOM_EVENT, zrobCos);

private function zrobCos(event:MyEvent):void
{
trace("produkt odebrany! - " + event.prod.nazwa); // np. nazwa
}

oraz wywołanie w TitleWindow:

var messageEvent:MyEvent = new MyEvent(MyEvent.MY_CUSTOM_EVENT);
messageEvent.prod = prod; // twój obiekt typu Produkt
dispatchEvent(messageEvent);


pozdrawiam,
JarekJarek Szczepański edytował(a) ten post dnia 05.08.10 o godzinie 21:23
Karol Dulęba

Karol Dulęba Programista

Temat: Przekazanie danych z TitleWindow

Żeby odebrać dane z parametru przekazanego w event najlepiej stworzyć własną klasę dziedziczącą Event:

package coms
{
import flash.events.Event;
public class myConditionalEvent extends Event
{
public var MiscInfo:Object;
public function myConditionalEvent(type:String, MiscInfo:Object=null)
{
super(type, true, true);
this.MiscInfo = MiscInfo;
}

public static const PROD_DEL:String = "prodDEL";
public static const PROD_UNDEL:String = "prodUNDEL";
public static const PARAM_ADD:String = "paramADD";
public static const PARAM_DEL:String = "paramDEL";
public static const PARAM_CPY:String = "paramCPY";

override public function clone():Event
{
return new myConditionalEvent(type, this.MiscInfo);
} }
}


w Application dajesz:

definicje meta:


<mx:Metadata>
[Event(name="PROD_DEL", type="coms.myConditionalEvent")]
[Event(name="PROD_UNDEL",type="coms.myConditionalEvent")]
[Event(name="PARAM_ADD", type="coms.myConditionalEvent")]
[Event(name="PARAM_DEL", type="coms.myConditionalEvent")]
[Event(name="PARAM_CPY", type="coms.myConditionalEvent")]
</mx:Metadata>


import definicji klasy:

import coms.myConditionalEvent;


później gdzieś np. w onComplete tworzysz listenery:


private function onComplete():void
{
this.addEventListener(myConditionalEvent.PROD_DEL,onProdDel);
this.addEventListener(myConditionalEvent.PROD_UNDEL,onProdUnDel);
this.addEventListener(myConditionalEvent.PARAM_ADD,onParamAdd); this.addEventListener(myConditionalEvent.PARAM_DEL,onParamDel); this.addEventListener(myConditionalEvent.PARAM_CPY,onParamCpy); }


W obsłudze zdarzenia możesz spokojnie odwoływać się do dodatkowych danych które przekazujesz z PopUpa


private function onProdDel(event:myConditionalEvent):void
{ trace(event.MiscInfo);
}


Na koniec w PopUp wywołujesz zdarzenie:


dispatchEvent(new myConditionalEvent(myConditionalEvent.PROD_DEL,data));


to powinno załatwić sprawę, choć osobiście częściej tworząc PopUpa dodaje mu listenera w stylu:


popupwindow.addEventListener(CloseEvent.CLOSE , OnPopUpClosed)


i obsługuje w ten sposób:


private function OnPopUpClosed(event:CloseEvent):void
{
trace(event.target.data);
}


Jeżeli masz jakieś pytania to postaram się odpowiedzieć na ile pamiętam ten kod
Stanislaw Żółkiewski

Stanislaw Żółkiewski Looking for an
excellent job

Temat: Przekazanie danych z TitleWindow

Panowie, aleście pojechali. Kolega przecież napisał, że zaczyna.

Ale skoro już się dzielimy się dobrymi wzorcami, to:


public class MyEvent extends Event
{
(...)

override public function clone():Event {
(...)
}
}


Jakby nadal były problemy, to również oferuję pomoc.
Jarek Szczepański

Jarek Szczepański Flash Platform
Developer

Temat: Przekazanie danych z TitleWindow

oh tam... przesadzasz :)

i czy mógłbyś wyjaśnić do czego służy ten clone? czasem go widzę w customowych eventach, ale mnie osobiście nigdy nie był do niczego potrzebny...

Jarek
Wojciech Asztemborski

Wojciech Asztemborski Flash Platform /
J2EE Developer

Temat: Przekazanie danych z TitleWindow

Bo tak chce Adobe :)


You are required to override the Event.clone() method in your subclass. The clone() method returns a cloned copy of the event object by setting the type property and any new properties in the clone. Typically, you define the clone() method to return an event instance created with the new operator.


O ile dobrze pamiętam, wynika to z faktu, że listener tak naprawdę otrzymuje nie oryginalną instancję eventu, ale jego klona. Dlatego jeśli w nie nadpiszemy tej metody, zadziała oryginalna (czyli zwracająca Event, a nie MyEvent). Wówczas możemy pożegnać się z "produktem" Irka.
Olga Grabek

Olga Grabek Senior Software
Engineer

Temat: Przekazanie danych z TitleWindow

Jarek Szczepański:
oh tam... przesadzasz :)

i czy mógłbyś wyjaśnić do czego służy ten clone? czasem go widzę w customowych eventach, ale mnie osobiście nigdy nie był do niczego potrzebny...

Jarek

Metoda istotna, bo wywoływana przez klasę EventDispatcher w momencie przesyłania obiektu zdarzenia, czyli gdy wywołujesz dispatchEvent(event).
Jarek Szczepański

Jarek Szczepański Flash Platform
Developer

Temat: Przekazanie danych z TitleWindow

Olga Grabek:
Jarek Szczepański:
oh tam... przesadzasz :)

i czy mógłbyś wyjaśnić do czego służy ten clone? czasem go widzę w customowych eventach, ale mnie osobiście nigdy nie był do niczego potrzebny...

Jarek

Metoda istotna, bo wywoływana przez klasę EventDispatcher w momencie przesyłania obiektu zdarzenia, czyli gdy wywołujesz dispatchEvent(event).

OK. doczytałem co i jak...
Metoda istotna, ale tylko w szczególnym (i rzadkim) przypadku gdy przechwytujemy event i chcemy go ponownie wysłać.

moim zdaniem marnowanie czasu...

Jarek

konto usunięte

Temat: Przekazanie danych z TitleWindow

Jarek Szczepański:
>
moim zdaniem marnowanie czasu...

moim tez ... ale zawsze sie balem, ze jak nie nadpisze clone'a to mi sie cos zlego stanie...

konto usunięte

Temat: Przekazanie danych z TitleWindow

Mateusz M.:
Jarek Szczepański:
>
moim zdaniem marnowanie czasu...

moim tez ... ale zawsze sie balem, ze jak nie nadpisze clone'a to mi sie cos zlego stanie...

Dokładnie. Może głowe urwać na pół dnia :)
Tomasz Morawski

Tomasz Morawski człowiek
orkiestra...

Temat: Przekazanie danych z TitleWindow

biada temu co clone'a nie nadpisuje :)

Temat: Przekazanie danych z TitleWindow

Panowie dziękuje Wam wszystkim za pomoc :)
Nie spodziewałem się takiego zainteresowania.

Problem już rozwiązany i nie użyłem do tego eventów (chyba ;p).

kod w titleWindow:

public function dodaj():void{
Application.application.daneZokna = prod;
Application.application.dodajDoKosza();
}

Funkcję dodaj() wywołuje kliknięcie w przycisk.
W pierwszej linii kodu funkcji przekazałem zmienną do aplikacji głównej, a w drugiej wywołałem funkcje w Application, która już mogła skorzystać z przesłanych danych :)

Nie wiem czy takiego typu rozwiązania się stosuje, ale działa :)Ireneusz Grrr edytował(a) ten post dnia 06.08.10 o godzinie 22:42
Tomasz Morawski

Tomasz Morawski człowiek
orkiestra...

Temat: Przekazanie danych z TitleWindow

to bardzo nieeleganckie rozwiązanie i mało elastyczne, radziłbym jednak nauczyć się rozwiązywania takich sytuacji przez event'y
Łukasz Błachowicz

Łukasz Błachowicz codziennie wymiatam
i odkurzam

Temat: Przekazanie danych z TitleWindow

Nie nadpisując clone, przy ponownym dispatchowaniu dostaniesz błąd typu. Proste.

>Dokładnie. Może głowe urwać na pół dnia :)

To tez. Przy okazji.

konto usunięte

Temat: Przekazanie danych z TitleWindow

Tomasz Morawski:
to bardzo nieeleganckie rozwiązanie i mało elastyczne, radziłbym jednak nauczyć się rozwiązywania takich sytuacji przez event'y


A jak eventem przekażesz jakiś parametr?

konto usunięte

Temat: Przekazanie danych z TitleWindow

tworzac wlasna klase rozszerzajaca Event

Następna dyskusja:

Flex i Zend_Framework wymia...




Wyślij zaproszenie do