Anyone feel a need to have something like goog’s “listenOnce” functionality? We’ve never had it in Flex and I didn’t really feel the need.
Harbs > On Dec 26, 2019, at 9:35 PM, Harbs <[email protected]> wrote: > > OK. Thanks. > > I’m going to try and rework events sometime over the next few days and I hope > to get rid of EventTarget, make it more PAYG and I’ll fix this too. > > Stay tuned… > > Harbs > >> On Dec 26, 2019, at 7:56 PM, Josh Tynjala <[email protected]> wrote: >> >> I seem to recall recently being surprised to learn that you can capture an >> event that doesn't bubble. >> >> I just tried in Flash, and I can confirm that a non-bubbling event can be >> seen by a parent during the capture phase. >> >> var sprite:Sprite = new Sprite(); >> var child:Sprite = new Sprite(); >> sprite.addChild(child); >> >> sprite.addEventListener(Event.CHANGE, function(event:Event):void >> { >> trace("parent (capture):", event.eventPhase); >> }, true); >> >> child.dispatchEvent(new Event(Event.CHANGE, false)); >> >> >> >> -- >> Josh Tynjala >> Bowler Hat LLC <https://bowlerhat.dev> >> >> >> On Wed, Dec 25, 2019 at 2:25 AM Harbs <[email protected]> wrote: >> >>> Capture phase will only work if the event.bubbles is true. >>> >>> I think that’s correct behavior. Someone please correct me if I’m wrong. >>> >>>> On Dec 25, 2019, at 12:23 PM, [email protected] wrote: >>>> >>>> This is an automated email from the ASF dual-hosted git repository. >>>> >>>> harbs pushed a commit to branch develop >>>> in repository https://gitbox.apache.org/repos/asf/royale-asjs.git >>>> >>>> >>>> The following commit(s) were added to refs/heads/develop by this push: >>>> new 2f8ef75 Fixed event bubbling >>>> 2f8ef75 is described below >>>> >>>> commit 2f8ef759d700f439fa40cc2abf6aefbb04ab4bdb >>>> Author: Harbs <[email protected]> >>>> AuthorDate: Wed Dec 25 12:23:13 2019 +0200 >>>> >>>> Fixed event bubbling >>>> --- >>>> .../org/apache/royale/events/EventDispatcher.as | 72 >>> ++++++---------------- >>>> 1 file changed, 18 insertions(+), 54 deletions(-) >>>> >>>> diff --git >>> a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>> b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>>> index 34871d5..510b531 100644 >>>> --- >>> a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>>> +++ >>> b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>>> @@ -90,8 +90,23 @@ package org.apache.royale.events >>>> //console.log("assigned target to >>> event ",event); >>>> } >>>> } else return false; >>>> + var ancestorsTree:Array = null; >>>> + if(event1.bubbles) >>>> + { >>>> + var ancestor:Object = >>> this.getParentEventTarget(); >>>> + if (ancestor) { >>>> + ancestorsTree = []; >>>> + var ancestorCount:int = 1; >>>> + for (; ancestor; ancestor = >>> ancestor.getParentEventTarget()) { >>>> + ancestorsTree.push(ancestor); >>>> + // goog.asserts.assert( >>>> + // (++ancestorCount < >>> goog.events.EventTarget.MAX_ANCESTORS_), >>>> + // 'infinite loop'); >>>> + } >>>> + } >>>> + } >>>> >>>> - return super.dispatchEvent(event1); >>>> + return >>> goog.events.EventTarget.dispatchEventInternal_(_dispatcher, event1, >>> ancestorsTree); >>>> } >>>> /** >>>> * @royaleignorecoercion org.apache.royale.core.IChild >>>> @@ -129,59 +144,8 @@ package org.apache.royale.events >>>> } >>>> >>>> public function toString():String >>>> - { >>>> - return "[object Object]"; >>>> - } >>>> - private static function installOverride():Boolean{ >>>> - goog.events.EventTarget.dispatchEventInternal_ = >>> dispatchEventInternal; >>>> - return true; >>>> + { >>>> + return "[object Object]"; >>>> } >>>> - private static var overrideInstalled:Boolean = >>> installOverride(); >>>> - /** >>>> - * Dispatches the given event on the ancestorsTree. >>>> - * >>>> - * @param {!Object} target The target to dispatch on. >>>> - * @param {goog.events.Event|Object|string} e The event object. >>>> - * @param {Array<goog.events.Listenable>=} opt_ancestorsTree The >>> ancestors >>>> - * tree of the target, in reverse order from the closest ancestor >>>> - * to the root event target. May be null if the target has no >>> ancestor. >>>> - * @return {boolean} If anyone called preventDefault on the event >>> object (or >>>> - * if any of the listeners returns false) this will also return >>> false. >>>> - * @private >>>> - */ >>>> -private static function dispatchEventInternal(target:EventDispatcher, >>> e:org.apache.royale.events.Event, opt_ancestorsTree:Array):Boolean { >>>> - /** @suppress {missingProperties} */ >>>> - var type:String = e.type; >>>> - >>>> - var rv:Boolean = true, currentTarget:Object; >>>> - >>>> - // Executes all capture listeners on the ancestors, if any. >>>> - if (opt_ancestorsTree) { >>>> - for (var i:int = opt_ancestorsTree.length - 1; >>> !e.propagationStopped_ && i >= 0; >>>> - i--) { >>>> - currentTarget = e.currentTarget = opt_ancestorsTree[i]; >>>> - rv = currentTarget.fireListeners(type, true, e) && rv; >>>> - } >>>> - } >>>> - >>>> - // Executes capture and bubble listeners on the target. >>>> - if (!e.propagationStopped_) { >>>> - currentTarget = e.currentTarget = target; >>>> - rv = currentTarget.fireListeners(type, true, e) && rv; >>>> - if (!e.propagationStopped_) { >>>> - rv = currentTarget.fireListeners(type, false, e) && rv; >>>> - } >>>> - } >>>> - >>>> - // Executes all bubble listeners on the ancestors, if any. >>>> - if (opt_ancestorsTree && e.bubbles) { >>>> - for (i = 0; !e.propagationStopped_ && i < opt_ancestorsTree.length; >>> i++) { >>>> - currentTarget = e.currentTarget = opt_ancestorsTree[i]; >>>> - rv = currentTarget.fireListeners(type, false, e) && rv; >>>> - } >>>> - } >>>> - >>>> - return rv; >>>> -}; >>>> } >>>> } >>>> >>> >>> >
