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

时间:2009-11-10 12:14:34

标签: flex actionscript-3 model-view-controller events controller

我正在努力创建一个简单的MCV应用程序,以便更好地理解MVC。我遇到的问题是注册事件监听器。 我看到MVC的方式是视图调度事件,控制器侦听这些事件并对其进行操作,更新模型或修改视图。 所以在我的MVC应用程序中,我有一个控制器,在初始化期间应该注册视图调度的所有事件。这是我的控制者:

public class AppController扩展了UIComponent     {         private var _model: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文件中,我初始化控制器并添加视图组件。

        

        private function onInit():void
        {
            var _model:StaffAppModel = new StaffAppModel();
            var _controller:AppController = new AppController( _model );

        }
    ]]>
</mx:Script>

<mx:VRule horizontalCenter="-56" bottom="10" top="10" width="1" strokeColor="#000000"/>

<comp:DetailsView x="10" y="17" width="325" />
<comp:StaffListView x="352" y="10" height="570" width="400"/>

然后我从这些视图组件中分派事件。以下是调度事件的视图示例:

public function saveUser():void             {                 _userObj.setFirstname(firstnameTxt.text);                 _userObj.setLastname(lastnameTxt.text);                 _userObj.setJobtitle(jobTitleTxt.text);                 var evt:SaveUserEvent = new SaveUserEvent(_userObj);

            dispatchEvent( evt );
        }

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

由于

2 个答案:

答案 0 :(得分:1)

由于您的控制器不在视图堆栈上,因此它永远无法捕获该事件。通常,您希望在控制器中引用视图,以便直接附加事件侦听器。另一种方法是创建一个扩展EventDispatcher的单例调度程序类。通过这种方式,您可以在中央集线器中发送和侦听事件,并且所有内容都可以保持解耦。例如,你的观点可以去:

myDispatcher.dispatchEvent(new MyEvent( MyEvent.SOMETHING_AWESOME) )

和您的控制人员:

myDispatcher.addEventListener(MyEvent.SOMETHING_AWESOME, awesomeHandler);

答案 1 :(得分:0)

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

this.addEventListener( "saveUserEvent", saveUserHandler );

这意味着如果“this”调度该事件,则会触发该事件。我想你想要在你的视图中添加事件监听器,如下所示:

myView.addEventListener( "saveUserEvent", saveUserHandler );

然后当“myView”调度“saveUserEvent”时,将调用saveUserHandler函数。

希望这会对你有所帮助。