Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.06.2014, 17:52
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 1  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
По умолчанию 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;
		}
	}
}
Все ли я тут сделал правильно и достаточно ли гибким есть построение этого компонента на случай, если надо будет вносить в него изменения?

Старый 06.06.2014, 17:57
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 2  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
О какой гибкости вы говорите, имея это?
Код 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, ещё не поняв до конца суть ООП?

Уже тошнит повторять одно и то же вам.
__________________
There is no thing in this world that is not simple.

Старый 06.06.2014, 18:09
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 3  
Ответить с цитированием
2misha

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

Старый 06.06.2014, 18:11
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 4  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Попробуйте представить, что страниц ещё нет. Ни одной. Не написаны.
Сначала вы пишете меню, а потом больше не трогаете его код, а потом из главного класса добавляете все кнопки в нужном вам порядке.
__________________
There is no thing in this world that is not simple.

Старый 06.06.2014, 20:23
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
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 у них недоступно. В ините моделе подписки не делаются, в ините контроллера - можно.
Дальше просто не стал читать, пока разбиритесь со структурой
__________________
Марк Tween

Старый 06.06.2014, 20:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
А следующая тема будет "MVC сайт"? )
__________________
Ко мне можно и нужно обращаться на ты)

Старый 07.06.2014, 03:55
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 7  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
А следующая тема будет "MVC сайт"? )
Наверное, но это больше будет похоже на правду, так как там должен вступить сервер, если без сервера, то в одной вьюхе все - и до свидания ) И это без шуток.
__________________
Марк Tween

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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