![]() |
команда наверх из глубокого вложения
есть у меня примерно такая структура:
windowContainer -> window -> component -> someItem -> someButton windowContainer — это DisplayObject, в котором есть метод newWindow(window:IWindow), который организует открытие нового окна и "зашторивание" открытых ранее окон. так же есть другие методы, неважно. window — собственно окно, с методами close(), get/set enabled и т.д. component — любой компонент. в данном случае это будут превьюшки. someItem — объект-превьюшка. содержит картинку и пару кнопок. someButton — кнопочка (одна из этой пары), по нажатию на которую нужно открыть новое окно в windowContainer Ну вот собственно по неопытности парюсь, как это лучше всего обставить. Пока варианты такие: 1. SomeButton implements IWindowOpener и содержит public function get window():IWindow. по нажатию диспатчим наверх событие-запрос, его ловит WindowContainer и делает this.newWindow((e.target as IWindowOpener).window); 2. передавать ссылку на windowContainer каждому ребенку 3. синглтон. тем более, что windowContainer в любой момент времени должен быть в единственном экземпляре. что посоветуете, бывалые? |
может быть проще подписаться на событие CLICK у кнопочки, а потом вручную вызвать windowContainer.newWindow(...). Или у вас вся структура живет своей жизнью, что выгоднее все через события делать?
|
Цитата:
Напротив, она сама открывает окно, что мешает просто подписаться на клик и кинуть по этому клику событие, которое поймает какой-ниь контроллер и откроет нужное окно Да и вообще в большинстве случаев можно напрямую в обработчике клика написать windowContainer.newWindow(<наше нужное окно>) Как сделано у нас(НЕ значит что удачно): - Есть PopUp-манаджер, который вначале инициализируется слоем, на котором будут располагаться все окна - Этому менеджеру вообще все равно IWindow его просят показать или DisplayObject - он просто добавляет его на слой и подкладывает подложку(если выставлен параметр "modal") - чтобы на ранее открытые окна или в игру клики не проходили т.е. у него 2 метода addPopUp(popUp: DisplayObject, modal:Boolean) и removePopUp(popUp: DisplayObject) - Дальше делаем окно с методом open() - в котором оно само себя добавляет в менеджер - Нужно добавить не окно, а менюшку? - пожалуйста - интерфейс не ограничен. |
i.o.
ну просто какое окно открывать знает именно кнопка expl у меня все окна modal. менеджер (windowContainer) просто открывает окна и организует модальность. но ему надо подать это окно — вот и спрашиваю, как? обоим: ну вот я и думаю подписать windowContainer на CLICK по себе (будем ловить все что всплывает), и если e.target is IWindowOpener, то this.newWindow((e.target as IWindowOpener).window) — это и есть вариант 1 =) в данном случае интерфейс я использую для опознания что ли. |
Цитата:
(Опять же, не считаю наше решение идеальным) Цитата:
потому что седня кнопка открывает окно, завтра - выполяет другое действие. Или другой вариант - была текстовая кнопка - стала кнопка-иконка И что - давай делать ее наследника с интерфейсом IWindowOpener? как-то не комильфо. |
другими словами: вариант 3 нравится больше?
|
Ну да 3-й.
2-й тоже адекватен, но чтобы его применить нужны какие-то дополнительные причины: - одни окна должны появляться поверх всего приложения, а другие поверх элементов внутри какой-нть скроллируемой области, т.е. возможно несколько windowContainer'ов; - нужно протестировать элементы в отдельности от windowContainera; - не знаю что ещё; Если причин нет - то он только повысит сложность |
ясно. в принципе к нему склонялся больше всего.
спасибо за советы! |
Если я правильно понял, то у компонента есть свойство window. Можно просто добавить свойство windowContainer в window. Следовательно, станет возможным компонентом обратится к windowContainer через window.windowContainer, т.е мы сможем достучаться до windowContainer без синглтона. Так лучше с позиции ООП.
|
с позиции ООП сразу на ум пришло словосочетание "pureMVC" на слово команда )
не знаю почему, но таких задач что-то не возникало, как у автора топика |
| Часовой пояс GMT +4, время: 03:00. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.