【问题标题】:addEventListener is not working when dispatchEvent is invoked in a model (MVC) AS3在模型(MVC)AS3 中调用 dispatchEvent 时 addEventListener 不起作用
【发布时间】:2011-01-11 17:40:35
【问题描述】:

我有一个问题,我在模型类中分派了一个正确分派的事件。当试图在客户端听这个时,什么都听不到。 Client.as 实例化所有 MVC 元素,例如:

var _biosModel:IMultiDataModel = new BiosPanelModel();

用户单击会调用“BiosPanelModel.as”中的“更新”方法,如下所示:

override public function update():void
{
    debug("[BiosPanelModel.update]");
    dispatchEvent(new Event(Event.CHANGE)); // dispatch event
}

Client.as 然后尝试收听这个分派的事件,但没有,我不知道为什么!?像这样:

this._biosModel.addEventListener(Event.CHANGE, eventHandler);

eventHandler 没有被调用!

希望有人可以帮助我,因为我觉得这应该很简单! :-(

感谢阅读

克里斯

【问题讨论】:

    标签: actionscript-3 events event-handling


    【解决方案1】:

    我首先尝试将bubbles 参数设置为true。所以,像这样发送事件:

    dispatchEvent(new Event(Event.CHANGE, true));
    

    这将使您不必在调度程序上显式侦听事件,并允许在冒泡阶段捕获事件。

    编辑
    不是 最终的答案......一旦你让它正常工作,你可能想要删除气泡 = True,除非你想在你之后明确取消事件捕捉它。原因是 Event.CHANGE 事件是一个非常常见的事件,并且在显示列表链中将该事件冒泡可能会很混乱,特别是如果有其他处理程序正在侦听 CHANGE 事件。但是,它让你知道你是否正确地附加了你的监听器。
    END EDIT

    您可能想要尝试的另一件事(因为从您上面编写代码的方式看不出来)是在创建实例后立即添加事件侦听器。此外,请确保您的 _biosModel 是一个实例属性,而不是在生成它的某个函数的范围内定义。

    package ... {
    
        import flash.events.Event;    
    
        public class Something extends SomethingElse {
    
            var _biosModel:IMultiDataModel;
    
            public function Something() {
                this._biosModel = new BiosPanelModel();
                this._biosModel.addEventListener(Event.CHANGE, __eventHandler);
            }
    
            private function __eventHandler($evt:Event) {
                trace("SUCCESS");
            }
        }
    }
    

    【讨论】:

    • 感谢您的快速回答,非常有用。我发现了问题。在名为“model”的“_biosModel”父类中,EventDispatcher 类被子类化。在“模型”中,几个 EventDispatcher 方法被覆盖,这些方法正在停止 EventDispatcher 功能,即覆盖公共函数 dispatchEvent(event:Event):Boolean,哎呀,我花了这么长时间!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2012-04-03
    • 2013-04-04
    相关资源
    最近更新 更多