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

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

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

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

Как лучше всего заставить это работать?

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

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

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

-Дэйв

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

Спасибо за помощь!


person Community    schedule 12.05.2009    source источник


Ответы (3)


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

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

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

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

person Marc Hughes    schedule 13.05.2009
comment
О, это звучит до странности логично. Я хотел сделать элементы шаблона (дочерние) настолько тупыми, насколько это возможно, но по какой-то причине мне никогда не приходило в голову «внедрить» все, что мне нужно, из основного приложения в клиент. Я был отчасти слеп, заставляя клиента читать от родителей. Я попробую это, звучит очень логично. Спасибо! - person ; 13.05.2009

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

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

  • Bifff - позволяет настраивать элементы в любом представлении с помощью селектора css.
  • Glue - фреймворк MVC на основе bifff
  • Mate - фреймворк MVC

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

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

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

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

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

person Sean Clark Hess    schedule 12.05.2009
comment
Хотя мне нравится подход MVC, я не совсем уверен, подходит ли мне использование фреймворка поверх Flex (пока что). Пока я все еще привыкаю к ​​Flex, и пока код не кажется чистым и удобным. Я сам занимаюсь PHP, так что, возможно, это как-то связано с этим. Спасибо за внимание, я добавил их все в закладки! Я просто не могу поверить, что у меня нет (простого) способа сделать это, конечно, я не единственный, у кого есть такая настройка :). - person ; 13.05.2009

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

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

person Sandeep Arneja    schedule 08.10.2009