我正在努力创建一个简单的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 );
}
现在是这样做的方法,为什么我的控制器没有注册事件处理程序?
由于
答案 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函数。
希望这会对你有所帮助。