Jak ogólnie działa propagacja zdarzeń i czy jest synonimem propagacji zdarzeń?

11

Próbuję owinąć głowę wokół ogólnych zasad działania i zasad wywoływania zdarzeń w (pod) systemach sterowanych zdarzeniami.

Chociaż korzystałem z niego kilkakrotnie, na przykład w Javascript, Flash (ActionScript 2 i 3), a nawet stworzyłem dla siebie prosty system wywoływania zdarzeń w PHP, nigdy tak naprawdę nie rozumiałem propagacji zdarzeń i / lub tak dobrze się rozmnaża.

Pierwsze pytanie:
czy propagacja zdarzeń jest synonimem propagacji zdarzeń?

Drugie pytanie: czy
mam rację, rozumiejąc, że gdy wydarzenie „pęka”, oznacza to, że „przesuwa się” ono w górę hierarchii obiektów?

Trzecie i najważniejsze pytanie:
czy moje rozumienie w pytaniu 2 jest prawidłowe; w jaki sposób generalnie realizuje się to „przesuwanie” hierarchii obiektów?
Czy to na ogół oznacza, że obiekt nadrzędny „redispatches” to samo zdarzenie do jego rodzica (aż osiągnie obiektu root)? A jeśli tak; czy wszystkie te obiekty w hierarchii muszą słuchać swoich dzieci w związku z tymi zdarzeniami, czy też brakuje mi czegoś istotnego w moim rozumieniu na temat propagacji zdarzeń, gdy nie ma potrzeby, aby obiekt nadrzędny rejestrował je jako osoby nasłuchujące zdarzeń podrzędnych?

Gdybyś mógł zilustrować te podstawowe zasady za pomocą jakiegoś prostego pseudo kodu, byłbym bardziej niż wdzięczny.

Przyzwoity Dabbler
źródło
1
Powiązany artykuł: Kolejność wydarzeń
Jonas

Odpowiedzi:

7

Pierwsze pytanie: czy propagacja zdarzeń jest synonimem propagacji zdarzeń?

Nie. Bubbling jest formą propagacji zdarzeń, ale nie może być używany jako synonim. Rozmnażanie to ogólny termin przekazywania wydarzenia. Bubbling to specyficzna strategia propagacji zdarzeń.

Drugie pytanie: czy mam rację, rozumiejąc, że gdy wydarzenie „pęka”, oznacza to, że „przesuwa się” ono w górę hierarchii obiektów?

Tak. Bąbelkowanie oznacza, że ​​idzie w górę hierarchii, w przeciwieństwie do tunelowania , co oznacza, że ​​idzie od górnego elementu w dół lub routingu , co oznacza, że ​​następnym obiektem, który odbierze zdarzenie, może być dowolnie wybrany.

Trzecie i najważniejsze pytanie: czy moje rozumienie w pytaniu 2 jest prawidłowe; w jaki sposób generalnie realizuje się to „przesuwanie” hierarchii obiektów?

Całkiem łatwe. W twojej hierarchii wizualnej formanty mają odniesienie do ich elementów nadrzędnych / wizualnych najwyższego poziomu lub mogą je gdzieś uzyskać. Więc kiedy przechwytują zdarzenie, po prostu powiadamiają o tym swojego rodzica, co powiadamia o tym rodzica itp.

Pseudo-kod jest taki jak w przypadku dowolnej kontrolki interfejsu użytkownika:

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

Jak powiedziały blueberryfields, nie musi być bezpośrednim rodzicem, który odbierze wydarzenie w następnej kolejności. Możesz również zaimplementować w ten sposób:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}
Sokół
źródło
+1 Pseudo kod ma dla mnie wiele sensu, dziękuję! (
Nawiasem mówiąc,
@fireeyedboy: Nie ma za co =)
Falcon
1

Pierwsza odpowiedź:

Bubbing zdarzeń jest jednym z określonych algorytmów kierujących propagacją zdarzeń.

Druga odpowiedź:

Nie, propagacja nie musi być związana z żadną hierarchią. Sposób, w jaki obiekty są reprezentowane wewnętrznie lub w innym miejscu, nie ma znaczenia, aby algorytm działał poprawnie. Idealnie, gdy wydarzenie pęka, rozszerza się na zewnątrz od najbardziej widocznego elementu na ekranie, aż do najbardziej widocznego elementu na ekranie.

Trzecia odpowiedź:

Szczegóły implementacji mogą się bardzo różnić w zależności od sposobu implementacji elementów wewnętrznych (przeglądarki). bubblingAlgorytm zależy od wizualizacji na ekranie. Jeśli element enkapsulujący znajduje się wyżej w hierarchii dziedziczenia niż element wewnętrzny, propagowanie można zaimplementować na przykład przy użyciu standardowych mechanizmów dziedziczenia w języku. Ale niekoniecznie jest to prawdą - możesz mieć specjalistyczny mechanizm, który może interpretować zarówno struktury wewnętrzne, jak i ich widoczność na ekranie oraz propagować zdarzenia zgodnie z algorytmem, ignorując wewnętrzną organizację.

Blueberryfields
źródło
1
Dlaczego mówisz: „bulgotanie niekoniecznie jest związane z jakąkolwiek hierarchią”. Moim zdaniem tak jest. Bez hierarchii nie ma bulgotania. Musi być jakieś drzewo. Czy możesz podać przykład bąbelkowania bez struktury drzewa? Twój przykład „od najbardziej wewnętrznego do najbardziej widocznego elementu” jest właśnie taki - wizualna hierarchia.
Falcon
1
Jasne, możesz zinterpretować to jako hierarchię, jeśli naprawdę chcesz. Wolę myśleć o tym jak o luźno sprzężonym grafie, który zawiera pewne elementy wizualne i niektóre nie wizualne.
blueberryfields,
2
Ale potem bulgocząca analogia zawodzi. Ponieważ na wykresie zdarzenie może być poprowadzone w dowolnym miejscu, a bąbelki wyraźnie przechodzą od dołu do góry.
Falcon
Myślę, że nie można już tego nazwać bulgotaniem na dowolnym wykresie. Należy to nazwać „routingiem zdarzeń”, a następnie imho.
Falcon
1
Uważam, że Falcon ma pewne uzasadnione argumenty. Rozsądnie jest myśleć o bulgotaniu jako o czymś, co się przesuwa (hierarchia).
Decent Dabbler,