Нужна помощь в понимании реализации MVC в Actionscript 3 AS3, пожалуйста - PullRequest
0 голосов
/ 22 марта 2010

Я изучаю реализацию MVC с помощью ActionScript 3.0. Пока я справился, но у меня есть пара вопросов, которые могут сделать этот процесс обучения очень приятным для меня. Буду очень признателен за вашу помощь и мудрость.

Позвольте мне объяснить, как я реализую простую реализацию MVC:

Мой Flash-фильм называется FusionMVC. У меня есть все файлы MVC в одном пакете, как это:

DataModel DataControl DataView Фасад приложения

Вот мой вопрос:

Насколько я понимаю, всякий раз, когда мне нужно разместить экранный объект на главной сцене, я объявляю или реализую этот экранный объект в классе DataView, я прав?

У меня есть символ / экранный объект под названием «Коробка» в основной библиотеке. Я добавляю этот символ на сцену, создав его экземпляр в классе DataView, который я могу видеть во время выполнения. Теперь, если мне нужно добавить EventListener под названием «ClickHandler» к этому объекту:

Где я могу объявить это событие "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 Ответ

1 голос
/ 23 марта 2010

Вы правы - экранные объекты должны обрабатывать события от своих собственных потомков:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...