![]() |
|
||||||||||
|
|||||
|
[+4 06.05.14]
|
Хотелось бы узнать у людей часто работающих с МВС, и вообще знающих - как вы делаете контроллер кнопок, скажем для меню ?
Сейчас я делаю так : создаю класс кнопки, и класс контроллера. Делаю контроллер суперклассом класса работающего с меню и кнопками , и передаю туда нужные параметры. Другой вариант завести в контроллер статические переменные и уже не делать его суперклассом. Вот мне кажется, что подход мой совершенно не правильный и надо срочно менять понимание этого. Вот хотелось бы посмотреть примерчик, как бы делали вы. По итогу контроллер рассчитывает какая кнопка нажата и идет переход в определенную часть сайта, даже если мой подход по созданию контроллера верный, то не понятно, как сделать из него именно этот переход, скажем выполнив функцию Main или какого нибудь другого класса унаследованного от спрайта например.... Вот хотелось бы во всей это каше созданной у меня в голове разобраться. Спасибо. 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); } } } 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; } } } 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. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Эм... А зачем кнопке контроллер то
![]() 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 в действии. Хранение текущего места в одном классе, переход - в другом, отображение действия - в третьем (правда не факт, что классе). |
|
|||||
|
[+4 06.05.14]
|
Цитата:
Добавлено через 2 минуты @maxkar PS , не вникал сильно, но вроде вы рассматриваете MVC , а я хочу в данный момент C+V или M+C , еще не понял че хочу, толком)) Скорее 2, чем 1 , ведь кнопка есть модель... |
|
|||||
|
Кнопка есть вью.
Добавлено через 3 минуты В моем понимании так (вроде именно так Psycho Tiger писал на эту тему): контроллер имеет ссылки на все кнопки (или контейнер, не суть важно.) Кнопка при клике по ней говорит контроллеру, что ее нажали. Контроллер обрабатывает запрос и говорит: эту панель скрыть, а эту показать, а вон ту - ее на задний план.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! Последний раз редактировалось TanaTiX; 30.03.2011 в 23:33. |
|
|||||
|
Цитата:
upd: опередили =)
__________________
...вселенская грусть |
|
|||||
|
strange mood
|
Начал писать ответ, и как-то не сразу заметил, что получилась целая эпопея
Поэтому добро пожаловать в блог: http://flasher.ru/forum/blog.php?b=348
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Не, на MVC мой подход точно не тянет. Это в лучшем случае MVVM - Model, View, View model. На самом деле еще хуже - MMMV. Model, model, model, ... View. Количество моделей произвольное и даже в одном интерфейсе между входной моделью и разными вью промежуточных слоев может быть разное количество. Контроллеров нет совсем, есть трансформеры моделей.
Цитата:
@TanaTIX: Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 00:41. |
|
|
« Предыдущая тема | Следующая тема » |
|
|