Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MVC менюшка (http://www.flasher.ru/forum/showthread.php?t=208139)

2misha 06.06.2014 17:52

MVC менюшка
 
Итак, недавно, дабы освоить шаблон MVC, я делал с ним кнопку, но как мне тут подсказали, кнопка - это чистое вьюв и для него MVC не нужно. По этому кнопку и переделал в один класс.

Теперь я сделал меню сайта с помощью шаблона проектирования MVC.

Документ-класс:
Код AS3:

package net.freedomstate.elements
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.display.Sprite;
        import net.freedomstate.elements.menu.View;
 
        public class Menu extends Sprite
        {
                private var _view: View;
 
                public function Menu(): void
                {
                        _view = new View;
                        addChild(_view);
                }
        }
}


Классы MVC:
Код AS3:

package net.freedomstate.elements.menu
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.*;
        import net.freedomstate.elements.Butt;
 
        public class View extends Sprite
        {
                private var _arrayButtons: Array = [  ];
 
                private var _model: Model;
                private var _controller: Controller;
 
                private var _currentPage: Sprite;
 
                public function View(): void
                {
                        _model = new Model();
                        _controller = new Controller(_model);
 
                        _model.addEventListener(Event.CHANGE, viewPage);
 
                        viewMenu();
                        viewPage();
                }
 
                private function addButton(text: String, page: String): void
                {
                        if (_arrayButtons.length == 0) _arrayButtons[_arrayButtons.length] = new Butt(175, 200, text)
                        else _arrayButtons[_arrayButtons.length] = new Butt(_arrayButtons[_arrayButtons.length - 1].x + _arrayButtons[_arrayButtons.length - 1].width + 5, 200, text);
                        addChild(_arrayButtons[_arrayButtons.length - 1]);
 
                        _arrayButtons[_arrayButtons.length - 1].name = page;
 
                        _arrayButtons[_arrayButtons.length - 1].addEventListener(MouseEvent.CLICK, clickButton);
                }
 
                private function clickButton(e: Event): void
                {
                        _controller.dispatchEvent(new DataEvent(Event.ADDED_TO_STAGE, false, false, e.target.name));
                }
 
                private function viewMenu(): void
                {
                        switch(_model.dostype)
                        {
                                case "guest": guestMenu(); break;
                                case "user": userMenu(); break;
                        }
                }
 
                private function viewPage(e: Event = null): void
                {
                        if (_currentPage) { removeChild(_currentPage); _currentPage = null }
 
                        _currentPage = new _model.currentPage;
                        addChild(_currentPage);
                }
 
                private function guestMenu(): void
                {
                        deleteButtonds()
 
                        addButton("Правила", "Description");
                        addButton("Карта", "Map");
                        addButton("Органи влади", "Authorities");
                        addButton("Підприємства", "Enterprises");
                        addButton("Реєстрація", "Registration");
                        addButton("Вхід", "Input");
                }
 
                private function userMenu(): void
                {
                        deleteButtonds()
 
                        addButton("Правила", "Description");
                        addButton("Карта", "Map");
                        addButton("Органи влади", "Authorities");
                        addButton("Підприємства", "Enterprises");
                        addButton("Профіль", "Profile");
                        addButton("Вхід", "Input");
                }
 
                private function deleteButtonds(): void
                {
                        for (var i: int = 0; i < _arrayButtons.length; i++ )
                        {
                                if (_arrayButtons[i]) { removeChild(_arrayButtons[i]); _arrayButtons[i] = null; }
                        }
                }
        }
}

Код AS3:

package net.freedomstate.elements.menu
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.events.*;
        import net.freedomstate.pages.*;
 
        public class Controller extends EventDispatcher
        {
                private var _model: Model;
 
                public function Controller(rModel: Model): void
                {
                        _model = rModel;
 
                        this.addEventListener(Event.ADDED_TO_STAGE, addPage);
                }
 
                private function addPage(e: DataEvent): void
                {
                        switch (e.data)
                        {
                                case "Description": _model.currentPage = Description; break;
                                case "Authorities": _model.currentPage = Authorities; break;
                                case "Enterprises": _model.currentPage = Enterprises; break;
                                case "Registration": _model.currentPage = Registration; break;
                                case "Input": _model.currentPage = Input; break;
                                case "Map": _model.currentPage = Map; break;
                                case "Profile": _model.currentPage = Profile; break;
                        }
 
                        _model.dispatchEvent(new DataEvent(Event.ADDED_TO_STAGE));
                }
        }
}

Код AS3:

package net.freedomstate.elements.menu
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.events.*;
        import net.freedomstate.pages.*;
 
        public class Model extends EventDispatcher
        {
                private var _dostype: String;
                private var _currentPage: Class;
 
                public function Model(): void
                {
                        _dostype = "guest";
                        _currentPage = Description;
 
                        this.addEventListener(Event.ADDED_TO_STAGE, addPage);
                }
 
                private function addPage(e: DataEvent): void
                {
                        dispatchEvent(new Event(Event.CHANGE));
                }
 
                public function get dostype(): String
                {
                        return _dostype;
                }
 
                public function get currentPage(): Class
                {
                        return _currentPage;
                }
 
                public function set currentPage(page: Class): void
                {
                        _currentPage = page;
                }
        }
}

Все ли я тут сделал правильно и достаточно ли гибким есть построение этого компонента на случай, если надо будет вносить в него изменения?

ZackMercury 06.06.2014 17:57

О какой гибкости вы говорите, имея это?
Код AS3:

switch (e.data)
                        {
                                case "Description": _model.currentPage = Description; break;
                                case "Authorities": _model.currentPage = Authorities; break;
                                case "Enterprises": _model.currentPage = Enterprises; break;
                                case "Registration": _model.currentPage = Registration; break;
                                case "Input": _model.currentPage = Input; break;
                                case "Map": _model.currentPage = Map; break;
                                case "Profile": _model.currentPage = Profile; break;
                        }

Вы что, с добавлением новой страницы будете опять лезть в классы менюшки?
Зачем вы лезете в MVC, ещё не поняв до конца суть ООП?

Уже тошнит повторять одно и то же вам.

2misha 06.06.2014 18:09

Ага, то есть надо написать класс Ивента, который будет не String с названием страницы передавать, а класс самой страницы, дабы не было свитча? Я правильно понял намек?

ZackMercury 06.06.2014 18:11

Попробуйте представить, что страниц ещё нет. Ни одной. Не написаны.
Сначала вы пишете меню, а потом больше не трогаете его код, а потом из главного класса добавляете все кнопки в нужном вам порядке.

in4core 06.06.2014 20:23

2misha - и тут тоже MVC не нужен, опять же стандартный вью. Максимум M+V. Не более. Я щас обстрагируюсь от того, что это меню и просто по коду буду править.

Код AS3:

public class Menu extends Sprite
        {
 
                public function Menu(): void
                {
                        const control:Controller = new Controller(this)
                }
        }

Код AS3:

public function Controller(host:Sprite): void
                {
                        _host = host;
                        _view.model = _model;
                        _host.addChild(_view);
 
                }

Код AS3:

public function View(): void
                {
                    addEventListener(Event.ADDED_TO_STAGE , onAdded);
                }
private function onAdded(e:Event)  :void
{
        //app started
}

Это по организации кода.
Теперь о бредовых ошибках :

Код AS3:

public function Controller(rModel: Model): void
                {
                        _model = rModel;
 
                        this.addEventListener(Event.ADDED_TO_STAGE, addPage);
                }
public function Model(): void
                {
                        _dostype = "guest";
                        _currentPage = Description;
 
                        this.addEventListener(Event.ADDED_TO_STAGE, addPage);
                }

Ни один ни второй не DO. Поэтому событие Event.ADDED_TO_STAGE у них недоступно. В ините моделе подписки не делаются, в ините контроллера - можно.
Дальше просто не стал читать, пока разбиритесь со структурой

caseyryan 06.06.2014 20:46

А следующая тема будет "MVC сайт"? )

in4core 07.06.2014 03:55

Цитата:

А следующая тема будет "MVC сайт"? )
Наверное, но это больше будет похоже на правду, так как там должен вступить сервер, если без сервера, то в одной вьюхе все - и до свидания ) И это без шуток.


Часовой пояс GMT +4, время: 09:37.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.