请帮助理解Actionscript 3 AS3中的MVC实现

时间:2010-03-22 15:03:54

标签: actionscript-3 actionscript

我正在学习使用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);
        }
    }
}

1 个答案:

答案 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();
}