我正在学习使用ActionScript 3.0的MVC实现。到目前为止,我做得还不错,但有几个问题可以让这个学习过程对我来说非常愉快。我非常感谢你的帮助和智慧。
让我解释一下我是如何实现一个简单的MVC实现的:
我的Flash电影名为FusionMVC。我将所有MVC文件放在同一个包中,如下所示:
的DataModel DataControl上 数据视图 应用程序门面
以下是我的问题:
正如我所理解的那样,每当我需要在主舞台上放置一个显示对象时,我在DataView类中声明或实现该显示对象,我是对的吗?
我在主库中有一个名为“Box”的符号/显示对象。我通过在DataView类中实例化它将这个符号添加到舞台上,我可以在运行时看到它。现在,如果我需要将一个名为“ClickHandler”的EventListener添加到此对象:
我在哪里宣布这个“ClickHandler”活动?我目前正在DataModel类中声明它。
我感到困惑的是在哪里声明EventHandler方法。 DataModel,还是DataControl?
感谢您的帮助。这是整个代码:
//DATAMODEL
package
{
import flash.events.*;
import flash.errors.*;
public class DataModel extends EventDispatcher
{
public static const UPDATE:String = "modelUpdaed";
private var _txt:String;
public function DataModel()
{
}
public function get Text():String
{
return _txt;
}
public function set Text(p:String):void
{
_txt = p;
notifyObserver();
trace("MODEL HAS BEEN CHANGED");
}
public function notifyObserver():void
{
dispatchEvent(new Event(DataModel.UPDATE));
}
public function sayHello(e:Event):void
{
trace("HEY HELLO");
}
}
}
//DATACONTROL
package
{
import flash.display.*;
import flash.events.*;
import flash.errors.*;
public class DataControl
{
private var _model:DataModel;
public function DataControl(m:DataModel)
{
_model = m;
}
}
}
//DATAVIEW
package
{
import flash.display.*;
import flash.events.*;
import flash.errors.*;
public class DataView extends Sprite
{
private var _model:DataModel;
private var _control:DataControl;
public var b:Box;
public function DataView(m:DataModel, c:DataControl)
{
_model = m;
_control = c;
addBox();
}
public function addBox():void
{
b = new Box();
b.x = b.y = 150;
//b.addEventListener(MouseEvent.CLICK, vHandler);
addChild(b);
}
}
}
//APPLICATION FACADE
package
{
import flash.display.*;
import flash.events.*;
import flash.errors.*;
public class Main extends Sprite
{
private var _model:DataModel;
private var _control:DataControl;
private var _view:DataView;
public function Main()
{
_model = new DataModel();
_control = new DataControl(_model);
_view = new DataView(_model, _control);
addChild(_view);
}
}
}
答案 0 :(得分:1)
你是对的 - 显示对象应处理来自自己孩子的事件:
public function addBox():void
{
b = new Box();
b.x = b.y = 150;
b.addEventListener(MouseEvent.CLICK, boxClickHandler);
addChild(b);
}
在视图中处理事件:
private function boxClickHandler(event:MouseEvent)
{
_control.sayHello();
}
然后您只需要在控制器中添加更改模型的方法:
public class DataControl
{
....
public function sayHello():void
{
_model.sayHello();
}