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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.03.2011, 22:32
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 1  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По умолчанию Контроллер кнопок меню

Хотелось бы узнать у людей часто работающих с МВС, и вообще знающих - как вы делаете контроллер кнопок, скажем для меню ?

Сейчас я делаю так : создаю класс кнопки, и класс контроллера. Делаю контроллер суперклассом класса работающего с меню и кнопками , и передаю туда нужные параметры. Другой вариант завести в контроллер статические переменные и уже не делать его суперклассом. Вот мне кажется, что подход мой совершенно не правильный и надо срочно менять понимание этого. Вот хотелось бы посмотреть примерчик, как бы делали вы.

По итогу контроллер рассчитывает какая кнопка нажата и идет переход в определенную часть сайта, даже если мой подход по созданию контроллера верный, то не понятно, как сделать из него именно этот переход, скажем выполнив функцию Main или какого нибудь другого класса унаследованного от спрайта например.... Вот хотелось бы во всей это каше созданной у меня в голове разобраться. Спасибо.

Код AS3:
package site.controllers 
{
	import flash.events.EventDispatcher;
 
	/**
	 * ...
	 * @author in4core
	 */
	public class MainMenuController extends EventDispatcher 
	{
 
		public function MainMenuController() 
		{
			super();
		}
 
		protected function setLocation($loc:String):void {
 
			trace($loc);
		}
	}
 
}
Код AS3:
package site.menus 
{
 
	/**
	 * ...
	 * @author in4core
	 */
	internal class MainMenuButton extends Sprite 
	{
		private var _label:String = 'custom';
 
 
		public function MainMenuButton() 
		{
			//....//
		}
 
 
		public function set nameLabel(s:String):void {
 
			_label = s;
 
		}
		public function get nameLabel():String {
 
			return _label;
		}
 
	}
 
}
Код AS3:
package site.menus 
{
	import flash.display.DisplayObjectContainer;
	import flash.display.Shape;
	import flash.display.Stage;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	import site.controllers.MainMenuController;
	import site.utils.Configuration;
	/**
	 * ...
	 * @author in4core
	 */
	public class MainMenu extends MainMenuController
	{
		private var _container:DisplayObjectContainer;
		private const _menuNames:Vector.<String> = new < String > ['About', 'Services', 'Portfolio', 'Contacts'];
		private var _button:MainMenuButton;
 
		public function MainMenu($container:DisplayObjectContainer) 
		{
			_container = $container;
 
			drawMenuBackground();
			addButtons();
		}
 
		private function drawMenuBackground():void {
 
			_container.addChild(MainMenuBack.drawBack());
			_container.x = Math.floor ( Configuration.STAGE_WIDTH / 2 - _container.width / 2 );
			_container.y = Configuration.MENU_Y;
		}
 
		private function addButtons():void {
 
			var _w:int = _container.width/2 - Configuration.MENU_BUTTON_WIDTH * _menuNames.length/2;
 
			for ( var i:*  in _menuNames ) {
 
				_button = new MainMenuButton();
				_button.nameLabel = _menuNames[i];
				_button.x = i * (_button.width + 2) + _w; 
				_button.addEventListener(MouseEvent.CLICK , setLoc)
				_container.addChild(_button);
			}
		}
 
		private function setLoc(e:MouseEvent):void 
		{
			super.setLocation((e.currentTarget as MainMenuButton).nameLabel);
		}
	}
 
}
ВОт так ( по максимуму очистил ненужный код) приблизительно щас все это выглядет


Последний раз редактировалось in4core; 30.03.2011 в 22:56.
Старый 30.03.2011, 23:12
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Эм... А зачем кнопке контроллер то

Код AS3:
public final class AppPageModel {
  private var location : String;
  public function getLocation() : String {
    return location;
  }
  public function setLocation(location : String) : void {
    if (this.location == location)
      return;
    this.location = location;
    fireListeners();
  }
}
 
public final class SetAppPageAction implements Action {
  private var location : String;
  private var model : AppPageModel;
  public function SetAppPageAction(location : String, model : AppPageModel) {
    this.location = location;
    this.model = model;
  }
  public function isAvailable() : Boolean {
    return location != model.getLocation();
  }
 
  public function invoke() : void {
    model.setLocation(location);
  }
 
  public function addChangeListener(f : Function) : void {
    model.addChangeListener(f);
  }
}
 
public static function renderMenu(model : AppPageModel, locations : Array) : DisplayObject {
  const res : Sprite = new Sprite();
  for each (var loc : String in locations) {
    const btn : DisplayObject = renderButtonFor(new SetAppPageAction(loc, model));
    /// place button.
    res.addChild(btn);
  }
  return res;
}
Реальная обработка событий (за исключением интересных моментов) пропущена.

Модель плавно превращается в другую модель. В реальности промежуточных слоев может быть несколько. Но везде модели плавно превращаются в другие модели. Ключевой момент - любые действия - часть какой-то модели. Всегда. Если нужно - преобразуются в Action. Ну а для перехода пишется другой класс, который подписывается на изменения AppPageModel и делает все, что ему нужно.

На самом деле аналог AppPageModel лежит в библиотеке. Листалка страниц (без спецэффектов) - тоже. А еще семейство различных методов для создания всех возможных (в том числе и неизвестных заранее) типов кнопок .

P.S. Да, Single Responsibility в действии. Хранение текущего места в одном классе, переход - в другом, отображение действия - в третьем (правда не факт, что классе).

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

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

Добавлено через 2 минуты
@maxkar PS , не вникал сильно, но вроде вы рассматриваете MVC , а я хочу в данный момент C+V или M+C , еще не понял че хочу, толком)) Скорее 2, чем 1 , ведь кнопка есть модель...

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Кнопка есть вью.

Добавлено через 3 минуты
В моем понимании так (вроде именно так Psycho Tiger писал на эту тему): контроллер имеет ссылки на все кнопки (или контейнер, не суть важно.) Кнопка при клике по ней говорит контроллеру, что ее нажали. Контроллер обрабатывает запрос и говорит: эту панель скрыть, а эту показать, а вон ту - ее на задний план.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!


Последний раз редактировалось TanaTiX; 30.03.2011 в 23:33.
Старый 30.03.2011, 23:33
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
ведь кнопка есть модель...
То есть кнопка - это хранилище данных? В моем понимании кнопка есть View, а точнее - ее часть

upd:
опередили =)
__________________
...вселенская грусть

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

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Да да, извините затупил. Значит V + C мне нужно.

Старый 31.03.2011, 07:15
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 7  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Начал писать ответ, и как-то не сразу заметил, что получилась целая эпопея Поэтому добро пожаловать в блог: http://flasher.ru/forum/blog.php?b=348
__________________
тонкий тролль, осеянный благодатью

Старый 31.03.2011, 12:46
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 8  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Не, на MVC мой подход точно не тянет. Это в лучшем случае MVVM - Model, View, View model. На самом деле еще хуже - MMMV. Model, model, model, ... View. Количество моделей произвольное и даже в одном интерфейсе между входной моделью и разными вью промежуточных слоев может быть разное количество. Контроллеров нет совсем, есть трансформеры моделей.

Цитата:
Ну поидее потому, что кнопка не должна решать, что произойдет когда ее нажмут, а вот контроллер как раз должен об этом заботится.
То, что не одна должна заботиться - это правильно. Но вопрос в том, должно ли UI кнопки, например, иметь параметры "enabled/disabled" или нет. Если может, нужно писать контроллер, который в нужные моменты свойства выставляет и т.п. Или можно его внести в модель действия для кнопки. В этом случае получается View model - модель для view в терминах view. Отсюда и разница. Можно жестко прикрутить Controller к UI и там разбираться, что и где было нажато. А можно создать действие и для него нарисовать "абстрактный UI".

@TanaTIX:
Цитата:
эту панель скрыть, а эту показать, а вон ту - ее на задний план.
И потом начинаются баги. В случае каких-то переходов какие-то панели могут быть не показаны, другие лишний раз показаны и т.п. Просто забыто будет. Для сложных UI вполне возможно. Альтернативный вариант - модель "активная страница приложения". К ней привязка различных компонент. Можно отдельно модели видимости панелей сделать - VisibleInState, например. И т.п. В качестве бонуса получаем, что в результате если какая-то страница сверстана правильно, она и будет сверстана правильно вне зависимости, откуда и как на нее попали.

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

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

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


 


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


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