来自项呈示器的自定义事件未被类检测到

时间:2012-08-19 21:37:33

标签: actionscript-3 flex events itemrenderer custom-event

我正在尝试从项呈示器(主应用程序文件/ root的子项)调度自定义事件。

Main.mxml中的代码:

<s:List id="movieGrid"itemRenderer="views.MovieRenderer" dataProvider="{new ArrayCollection()}">
    </s:List>

<s:Group width="100%" height="100%" bottom="60">
            <views:DetailedViewInfo id="detailed" includeIn="MoviePage" />
    </s:Group>

渲染器(点击的内容):

MyEventDispatcher.Dispatcher.dispatchEvent(new MovieClickEvent(MovieClickEvent.CLICKED, data));

DetailedViewInfo(创建完成):

MyEventDispatcher.Dispatcher.addEventListener(MovieClickEvent.CLICKED, clickHandler);

MyEventDispatcher:

package events
{
    import flash.events.EventDispatcher;

    public class MyEventDispatcher
    {   
        public static var Dispatcher:EventDispatcher = new EventDispatcher();
    }
}

事件:

package events
{
    import flash.events.Event;

    public class MovieClickEvent extends Event
    {
        public function MovieClickEvent(type:String, theMovieData:Object, bubbles:Boolean=true, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
            this._result = theMovieData;
        }

        public function get result():Object
        {
            return this._result;
        }

        override public function clone():Event
        {
            return new MovieClickEvent(type, result, bubbles, cancelable)
        }

        public static const CLICKED:String = "MovieClickEvent.CLICKED";

        private var _result:Object;

    }
}

我能够在Main.mxml中成功监听事件,但我还需要在SkinnableContainer中检测它 - “DetailedViewInfo”也是Main.mxml的子代:

他可能吗?我尝试导入所有相关的事件/类和相同的声明。即使我在Main.mxml中注释掉事件监听器,它也不起作用。我尝试在DetailedViewInfo中向项呈示器添加一个声明,但是这会导致应用程序崩溃并且没有任何可理解的错误。

有人可以向我解释应该如何做到这一点?我在我的应用程序中使用自定义事件并且之前没有发生过这种情况。任何帮助高度赞赏!

1 个答案:

答案 0 :(得分:2)

在发送事件之后,您似乎正在添加事件侦听器。我在那里看到你有一个includeIn语句:这意味着不会立即创建DetailedViewInfo组件,但只有在输入MoviePage状态时才会创建includeIn组件。可以在创建组件并附加事件侦听器之前调度该事件。

此问题的快速解决方法是不使用<views:DetailedViewInfo id="detailed" visible="false" includeInLayout="false" visible.MoviePage="true" includeInLayout.MoviePage="true" /> ,而是根据当前状态设置组件的可见性:

{{1}}

但是,如果您需要使用此功能,可能需要查看您的体系结构。不幸的是,我不能告诉你更多,因为我不知道你目前的架构。