Flex :: Why Need To Use Event Propagation
Feb 25, 2010Why we need to use event Propagation?
View 1 RepliesWhy we need to use event Propagation?
View 1 RepliesI have a custom TitleWindow component that is registered to listen for keyboard events from the user (so that esc closes the window, enter saves, etc.). However, in my testing I've found a couple cases where my keyboard event handlers don't fire. My best guess as to why this is happening is that there is some child component somewhere that has stolen focus and is stopping the keyboard events from propagating.
Unfortunately, due to the large number of components in my TitleWindow, I have no good way of knowing who has stolen the focus. My question then is, are there any good tips / techniques / tools for debugging focus issues and event propagation in Flex? Basically, I need something that will tell me who has the focus at any given time and who's handling an event at any given time... is that possible?
I have a Canvas (lets call it the Drop Box) which users can drag and drop external files onto. Next to this I have a ViewStack, of which one of the layers is a Canvas with a TileList. I have successfully managed to code it so that the items dropped onto the Drop Box appear in the TileList. I simply capture the darg drop event (lets call this event A) and dispatch a new one that the TileList is listening for (lets call this event B).
However, this only works if the ViewStack selectedIndex is set to that of the Canvas with the TileList. If the Canvas with the TileList isn't selected then the event listener which is added to the TileList at CreationComplete level (event B), won't be called until after the drag drop event has dispatched (event B). This means that something is firing before something even has a chance to listen for it!
I've tried looping until the Canvas with the TileList is completely drawn, but this causes the app to hang.
I've also tried passing the event to the Canvas and storing it locally, but when I attempt to access the clipboad of the event I get an error (dead clipboard).
Effectively I want to only dispatch the event to the Canvas after it's had a chance to load, and add the event listener to the TileList.
I have a custom component made up of a selectable control (radio button)and a text input. I want to perform some logic in response to the change events from both of those controls, but after that I want anything that is registered on the composite component's change handler to have a change to handle the events as well. The problem is, when I re-dispatch the events the event target has changed to my custom component, losing the originating event's target.
Here's my custom component:
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" label="{listItem.@text}" data="{listItem.@level.toString()}">
<mx:Script>
[code].....
In the event handler that receives change events from this component, I see that event.target is an instance of SpecifyRadioButton, not the TextInput or RadioButton, as I'd expect. How should I propagate the event to get what I want here?
Getting event [Event type="change" bubbles=false cancelable=false eventPhase=2]
from question0.tabSurvey.questionForm.questionContainer.Single94.VBox95.SpecifyRadioButton111
I'd like to have a double click event on a datagrid in Flex3. The following example only works if the Accordion (id = "mustBeSecond") container comes after the DataGrid. Why is the order of the components important and what can I do to prevent this behavior? (The example does not work. If you change the order of "mustBeSecond" and gridReportConversions" the example works fine)
<mx:Script>
<![CDATA[
import mx.controls.Alert;
[code].....
I have a movieclip containg several containers with other objects attached to them. Those containers have different levels of nesting. Now I want to add an EventListener to the top-level MovieClip and the called function uses attributes of this MovieClip. Because
of that I cannot just retrieve the MovieClip by saying e.target.parent but have to stop the propagation. I know there is a stopPropagation() method but I don't really get how (and when) to use it.
If I have sth like this:
function myResponse(e:Event):void {
//Things happening
} myMC.addEventListener(MouseEvent.CLICK, myResponse);
Where do I have to stop the propagation?
I have a container named circleHolder_mc. Inside I have four circles named circ0_mc circ4_mc. My goal is to have each circle blink on mouseover. The closest I've got is the following code which causes all of the circles to blink at the same time.
circleHolder_mc.addEventListener(MouseEvent.MOUSE_OVER, onBlink)circleHolder_mc.addEventListener(MouseEvent.MOUSE_OUT, unBlink)
var timer:Timer = new Timer(1);timer.addEventListener(TimerEvent.TIMER, onTimer);
function onTimer(evt:TimerEvent):void{ alpha +=7;}
function onBlink(evt:MouseEvent):void{ timer.start();} function unBlink(evt:MouseEvent):void{ timer.stop(); alpha = 100;}
how event propagation works in PV3D its definitely not like the conventional Flash style. On a quick search i have been able to find out that its possible using the InteractiveSceneManager Class, but unfortunately
View 1 RepliesI'm using Event Propagation in order to change the alpha of each Child on MOUSE_OVER, MOUSE_OUT, and MOUSE_DOWN using... evt.target.alpha On OVER the Child's alpha increases from 0 - 0.5. On OUT it goes from 0.5 - 0. On DOWN it goes to 0.5 and stays there even with a MOUSE_OUT. What I'd like to do is then add a button to the main stage which takes the visibility of all Children back to 0, a basic type of Clear button.
I have one way to do it where I list each Child in a function (all 9!). But can I re-write this so that all Children are effected writing so much code? Ideally I'd like to send a request to find the number of Children (9) and then use this variable to write a function which says (where 'n' is the Instance name of each Child) that n(0-numChildren).alpha = 0
[Code]...
What is the difference between event.bubbles to false for any event, And Setting event.stopPropagaion() or stopImmidiatePropagation() while handling event? I am using flex4 with as3.
View 3 RepliesI have just learnt about event propagation and have made a few successful tests. However, I have encountered a problem when trying to use event propagation with several MovieClips that are masked and nested in a movieclip. The display list like so:
hd_cont > cndMask > cndThumbs > 9 movieclips with instance names box0, box1, etc etc.
I am attempting to scale the 9 movieclips at the bottom.
So I have tried:
Code:
hd_cont.addEventListener(MouseEvent.MOUSE_OVER, boxGrow);
hd_cont.addEventListener(MouseEvent.MOUSE_OUT, boxShrink);
function boxGrow(e:MouseEvent):void {
TweenLite.to(e.target, 1.5, {scaleX:1.5, scaleY:1.5, ease:Strong.easeOut});
e.target.alpha = .5;
[Code] .....
But when I reference the cndMask I get a
Code:
TypeError: Error #1010: A term is undefined and has no properties.
at gallery_fla::MainTimeline/gallery_fla::frame3()
message in the output panel.
I have a couple of Sprites on my screen and I want to write a single event handler to handle the double click on any of those Sprites. The following approach works for every event type except DOUBLE_CLICK:
[Code]...
To make it work, because in my application I will have lots of Sprites. In my opinion, a single event and the target property are more efficient than hundreds of event listeners. Am I right or should add event listeners to every Sprite?
I have a "large" movie clip and "small" movie inside a "large" movie clip but on it's let's say upper right corner:
Code:
largeMc.addChild(smallMc);[
If i try to catch Mouse.DOWN events on them the following way:
Code:
largeMc.addEventListener(MouseEvent.MOUSE_DOWN, largeClicked);
smallMc.addEventListener(MouseEvent.MOUSE_DOWN, smallClicked);
Then of course both event are captured no matter where i click.Is it possible to capture independent mouse clicks on both of these two movie clips and if so, how can i do that?
i have a following situation: I have a "large" movie clip and "small" movie inside a "large" movie clip but on it's let's say upper right corner:
Code:
largeMc.addChild(smallMc);
If i try to catch Mouse.DOWN events on them the following way:
Code:
largeMc.addEventListener(MouseEvent.MOUSE_DOWN, largeClicked);
smallMc.addEventListener(MouseEvent.MOUSE_DOWN, smallClicked);
Then of course both event are captured no matter where i click.Is it possible to capture independent mouse clicks on both of these two movie clips and if so, how can i do that?
So I've got a project that loads some bitmaps and plonks each one on the display list with some events to allow me to drag them and click-to-front. It works fine by and large but if the bitmap is a PNG with transparency then normally clicking on a transparent bit will still trigger the events. I can get round that with a quick check of the pixel's alpha using hitTest no problem.
The issue I have is if there is a bitmap behind the front one showing through then I can't click on that. From Flash's POV I'm still clicking on the front-most clip as there is still something there, even if it is technically invisible, so the event is triggered 'properly'. From my point of view I want to click through that clip on the one behind it, like they were paper cutouts on a table.
I can't disable the top layer's mouseEnabled property because it still needs to listen for events. Either I need something like event propogation only with siblings on the display list or I'm going to have to maintain a list of all the relevant clips and keep checking they're under the mouse pointer. Obviously I'd rather the former at the latter is a kludge.
I have editable grids which are 2-way binded to my model. What I want is to validate my data when user edits any cell before it get updated in model. I have applied my validation at ItemEditEnd handler, but, I want to apply validation in between itemEditBegin and itemEditEnd events.
View 1 RepliesI hava a custom component and it contains a child icon. If I add a mouse-click event listener to both component(click-listener1) and icon(click-listener2), the event dispatched sequence is click-listener2, then click-listener1. I can understand it. But if I add a custom event to component (listener1), and mouse-click event to icon(listener2), when icon is clicked, the component will dispatch the custom event. In my test, the event dispatched sequence is listener1, then listener2. It doesn't match with event-bubbles rule.
In my opinion The custom event is dispatched in listener2, which triggers listener1. Why event flow sequence is not listener2, listener1?
In component.
icon.addEventListener(MouseEvent.CLICK, iconClickHandler);
private function iconClickHandler(event:MouseEvent):void
{
[Code].....
I am having trouble using a custom event in flex. I need to dispatch an event from inside two nested components and receive it in the main application file. The basic set up is a main application file importing a custom "gallery" component.
[Code]..
what should i do to get chart's data on the click of respective data Legend. suppose i have array [{id:123, label:sales, year:2010},{id:124, label:refunds, year:2010}]for a column chart which has year in x-axis and sales iny-axis.two legend showing labels sales and refund.What i want is to get the whole data (id:123, label:sales, year:2010) on clicking of the legend 'sales'.What should i do? I tried listening mouse click event and itemClick event.
View 1 RepliesI am trying to understand event propagation in Flex framework and have a following doubt on it:
Scenario: I have a built-in component DropDownList on change of which I want to create a custom event refreshPreview and want to propagate it to a custom component PictureComponent.
In the custom component's mxml, I have added the Metadata directive as follows to register a refreshPreview event with the compiler
<fx:Metadata>
[Event(name="refreshPreview", type="flash.events.Event")]
</fx:Metadata>
Layout Details: In my main mxml application I have laid out DropDownList and the custom component such that both are siblings (i.e. have a common indirect parent)
e.g.
<s:Group id="contentGroup">
<s:Group id="formGroup">
<s:Form x="11"
[Code]....
I am seeing that the refreshPreview event is not getting propagated to the custom component.
I doubt this is because the built-in component is a sibling of the target (where the event got generated) and not a parent. how to make refreshPreview event propagate to custom component?
printableInvoice.addEventListener(batchGenerated, printableInvoice_batchGeneratedHandler);Results in this error: 1120: Access of undefined property batchGenerated. I have tried it as FlexEvent.batchGenerated and FlashEvent.batchGenerated.
The MetaData and function that dispatches the even in the component printableInvoice is all right. It I instantiate printableInvoice as an mxml component instead of via action-script it well let put a tag into the mxml line: batchGenerated="someFunction()
This is NOT duplicate of my earlier post (its is slightly different)But this is similar issue with similar error but its not the same error The error I am getting now is below while dispatching the custom event from my custom component
TypeError: Error #1034: Type Coercion failed: cannot convert events::MapEvent@a74ab51 to flash.events.MouseEvent.
dispatchEvent(new MapEvent(MapEvent.CLICKED_ON_MAP));
Note: The error in my earlier post is giving below error message
Type Coercion failed: cannot convert flash.events::Event@81ecb79 to com.events.ShopEvent
The difference here are two things, the earlier error is while converting flash event to custom event and now this one is while converting custom event to flash event and secondly, I have no clue why it is trying to convert to the mouseevent where I am just dispatching my custom event with proper listeners.
This is my custome event
package events
{
import flash.events.Event;
import ui.map.MapElement;
[code]...
in flex application i have a button and two functions in action script. wat i wan is when i click the button it has to call a function and Abort and call another function simultaneously.
View 1 RepliesI have a repeater component with custom event. My repeater components fires custom event holding data. My need is to dispatch event so other repeater components can access data from dispatching component.
Edit: Added whole stuff here.
<!-- AttributeMapping.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009"
[Code].....
If I create an object like so:
class Foo {
[Bindable] public var property: String;
}
The class Foo has an implicit event dispatcher to handle property change events. How can I access that without making Foo explicitly extend EventDispatcher?
I have a small question. I am probably misunderstanding something, but when I do :
[Code]....
I have a textfield in flex with a focusOut event on it. I can type in the box and in Firefox and Chrome when I click elsewhere on the page (outside the flash element) the focusOut event will be triggered. However in IE8, the texfield never loses focus when you click elsewhere on the page, outside the flash object. I've tried with focusManager.browserMode set to true and false with no difference (I believe that effects incoming focus anyway).
View 1 Repliesoverriding clone() while creating custom events?I read in the Flex cookbook that we need just in case we want to redispatch this event. Does this exactly means that when we want event to be bubbled up the display hierarchy , at that time our custom cloned event should be dispatched and not the Event object.
second - whats the need of metadata tag -
[Event(name="modelEvent", type="com.abc.data.model.ModelEvent")]
public class LoginModel extends EventDispatcher
I understand we need to extend EventDispatcher in case we want to dispatch evnet from class.. but In what cases i would need to specify the MetaData TAg
Third is.. If i write -- "dynamic customEventClass extends Event".. Is there any use of Dynamic i can make?
I am using modules in flex, to build different parts of my webapp. What I need now, is a way these modules can communicate with each other on events. What really is happening is ,that there is a central module, which then will take care of loading other modules and passing data to and fro. But, coding for each part to delegate events to each of these loaded modules from the central module and back would be a big nightmare.
What I really want to do is have a global event bus for it. Are there any specific libraries, already existing for such a process. Also, I would be using MVC, so it should also take care between events form the model to the view and vice-a-versa.
I am trying to learn JavaScript and I am wondering whether JavaScript has a event listener just like ActionScript's ENTER_FRAME. Basically, I want this event listener to listen "all the time" not just wait for any particular instance (mouse click, keyboard event) of event.
View 3 Replies