AS3 / Flex: как заставить файлы mxml, загруженные через ViewStack, видеть переменные их родителей и т. Д.? - PullRequest
2 голосов
/ 12 мая 2009

Для проекта, над которым я работаю во Flex, я решил создать несколько отдельных файлов для каждой «темы», которые можно использовать. Поскольку каждая тема может и будет требовать определенного кода, изображений, стилей и практически чего-либо еще, классический вариант css-only на самом деле невозможен.

У меня есть одна проблема с этим методом, и это то, что каждый «дочерний» mxml-файл не может читать переменные и тому подобное, созданные в родительском приложении. Использование Application.application решает половину проблем, но любой вид решения с глобальными переменными кажется мне неудачным. И из-за этого код не становится намного чище.

Я создал класс, который загружается в основное приложение со статической переменной, которую я использовал в качестве AS3-эквивалента глобальных переменных. К сожалению, доступ к ним из этих «дочерних» mxml-файлов невозможен, я могу только повторно инициировать класс или написать функцию-обертку в основном приложении, которая извлекает эти переменные. Это, опять-таки, далеко не идеальный вариант, и все равно у меня нет достойного способа использовать методы из классов, которые были инициированы в родительском приложении.

Какой лучший способ заставить это работать хорошо?

Краткое изложение приложения:

1) Основное приложение загружает несколько классов / пакетов, запускает несколько с правильными настройками и тому подобное. 2) Основное приложение имеет ViewStack, в котором каждая тема создается из внешнего файла (themes / ThemeName.mxml) 3) Каждая тема должна иметь доступ как минимум к двум переменным, установленным основным приложением (с помощью загруженных классов и методов), а некоторым может также потребоваться прямой доступ к определенным функциям, которые должны быть доступны глобально для обоих основных приложений, а также конкретная тема mxml.

Надеюсь, мои объяснения немного ясны. Пожалуйста, задавайте любые вопросы, которые могут помочь вам понять это больше. Большое спасибо заранее!

-Dave

Небольшое обновление: Для большей ясности: у меня есть класс, который позволяет мне легко создавать вид с камеры. Я инициализирую и использую этот класс в основном приложении, которое затем помещает новый (web) cam (era) экземпляр в переменную, готовую для использования в любом месте, где это необходимо. Затем в файле просмотра (themes / theTheme.mxml) отображаются 2 камеры в зависимости от того, что они хотят. Я хочу, чтобы в файле просмотра использовались камеры, созданные в основном приложении, чтобы мне не приходилось просить ребят, создающих тему, реализовывать все это снова и снова. Это один из примеров того, почему мне это нужно.

Спасибо, что помогли мне до сих пор!

Ответы [ 3 ]

2 голосов
/ 13 мая 2009

Исходя из фона PHP, я вижу, где вы могли бы пойти не так. Это не похоже на php, где каждый файл - это просто большой код, который можно включить в другие файлы php.

Каждый mxml-файл является полноценным классом Actionscript. Вы не «включаете эти файлы mxml», вы фактически создаете свойства в своем основном классе mxml, и типы этих свойств относятся к «дочерним» объектам mxml.

Если вашим дочерним компонентам mxml действительно нужна некоторая информация от родителя, вы должны передать эти данные в них.

Но отступи немного. Вы уверены, что хотите, чтобы эти дочерние mxml-файлы выполняли всю эту работу? Могут ли они быть просто тупыми макетами, в которых нет логики? Тогда вы можете позволить основному mxml манипулировать ими.

1 голос
/ 13 мая 2009

Звучит так, будто ты готов к работе! Вы можете использовать Dependency Injection, чтобы устанавливать вещи в вашем приложении по мере их создания.

Вот некоторые фреймворки, которые помогают с внедрением зависимостей.

  • Bifff - позволяет вам устанавливать объекты на любом экране с помощью селектора css
  • Клей - Основа MVC на основе BIFFF
  • Mate - рамки MVC

Примечание: я являюсь автором Bifff and Glue.

В качестве примера, используя bifff, вы можете сказать следующее (устанавливает переменную "thePropertyFromMyFile" для любого компонента с помощью stylename = "customStyleName")

<Selector match=".customStyleName">
  <Set thePropertyFromMyFile="{myGlobalSettings.property}"/>
</Selector>

Однако, читая ваше описание, создается впечатление, что вы столкнулись с необходимостью создания полноценной платформы для своего приложения. Среды MVC помогают вам отделить данные вашего приложения (в вашем случае, в каком режиме отображения вы находитесь) от представлений, не требуя, чтобы представления вызывали Application.application или глобальный синглтон.

Это займет немного больше исследований для вас, но это правильный путь. Любое гибкое приложение может извлечь выгоду из фреймворка, выберите лучшее для вас.

0 голосов
/ 08 октября 2009

Вы можете очень легко сделать это. думать об этом в ООП моды. каждый mxml - это отдельный класс. Вы хотите вызвать метод одного класса в другом классе. Если вы хотите, чтобы он выполнялся в своей исходной области, сделайте переменную methor статической и вызовите ее с помощью MXMLFileName.MethodName ();

Если вы хотите выполнить в своей области видимости, создайте объект родительского MXML и затем вызовите метод.

...