Apache flex 在控制器中注册事件侦听器

Apache flex 在控制器中注册事件侦听器,apache-flex,actionscript-3,model-view-controller,events,controller,Apache Flex,Actionscript 3,Model View Controller,Events,Controller,为了更好地理解MVC,我正在创建一个简单的MCV应用程序。我遇到的问题是注册事件侦听器。 我对MVC的看法是,视图分派事件,控制器监听这些事件并对其采取行动,要么更新模型,要么修改视图。 因此,在我的MVC应用程序中,我有一个控制器,在初始化过程中,它应该注册视图调度的所有事件。这是我的控制器: myDispatcher.addEventListener(MyEvent.SOMETHING_AWESOME, awesomeHandler); 公共类AppController扩展UICompon

为了更好地理解MVC,我正在创建一个简单的MCV应用程序。我遇到的问题是注册事件侦听器。 我对MVC的看法是,视图分派事件,控制器监听这些事件并对其采取行动,要么更新模型,要么修改视图。 因此,在我的MVC应用程序中,我有一个控制器,在初始化过程中,它应该注册视图调度的所有事件。这是我的控制器:

myDispatcher.addEventListener(MyEvent.SOMETHING_AWESOME, awesomeHandler);
公共类AppController扩展UIComponent { 私有var_模型:StaffAppModel

    public function AppController( model:StaffAppModel)
    {
        trace( "controller created" );
        this._model = model;

        // start up register event listeners
        this.addEventListener( "saveUserEvent", saveUserHandler );      
    }

    // event handler
    public function saveUserHandler( e:SaveUserEvent ):void
    {
        trace("saveUserHandler run");
        trace( e._userObj.getFirstname() );     
    }
}
问题出在我的客户端文件中(我正在编写一个基于Flex的AIR应用程序,所以我有一个MXML文件)。在这个MXML文件中,我初始化了控制器并添加了视图组件

现在是这样做的吗?为什么我的控制器没有注册事件处理程序


谢谢

我想你的活动注册有点混乱。如果你说:

this.addEventListener( "saveUserEvent", saveUserHandler );
这意味着如果“this”分派事件,事件将被触发。我认为您希望将事件侦听器添加到视图中,如下所示:

myView.addEventListener( "saveUserEvent", saveUserHandler );
然后,当“myView”分派“saveUserEvent”时,将调用saveUserHandler函数


希望这对您有所帮助。

因为您的控制器不在视图堆栈上,所以它永远没有机会捕获事件。通常,您希望在控制器中有对视图的引用,以便可以直接附加事件侦听器。另一种方法是创建扩展
EventDispatcher
的singleton dispatcher类您可以在中央集线器中调度和侦听事件,并且所有内容都可以保持解耦。例如,您的视图可以:

myDispatcher.dispatchEvent(new MyEvent( MyEvent.SOMETHING_AWESOME) )
和您的控制器:

myDispatcher.addEventListener(MyEvent.SOMETHING_AWESOME, awesomeHandler);
myDispatcher.addEventListener(MyEvent.SOMETHING_AWESOME, awesomeHandler);