Flex условная компиляция MXML? - PullRequest
5 голосов
/ 11 сентября 2011

В Flex теперь можно использовать опцию компилятора -define, чтобы делать разные интересные вещи. В моей программе я использую эту опцию, так что часть моего кода исключается блоками вроде этого:

CONFIG::FACEBOOK{
   //Some code
}

И это хорошо работает.

Как мне получить подобное поведение с MXML?

Я хочу сделать то же самое, но исключая / включая теги MXML таким образом, а не блоки кода AS.

Ответы [ 3 ]

2 голосов
/ 18 июля 2012

Мое решение - добавить несколько тегов, которые могли бы помочь закомментировать ненужные блоки mxml-кода в определенной сборке. Например, я хочу добавить разные кнопки в сборки Android и iOS:

<!-- iOS --><!--
<s:Button id="backBtn" 
    icon="{SHOW_LIST}" 
    click="navigator.popView()"/>
--><!-- /iOS -->

<!--Android-->
<s:Button id="exitBtn" 
    label="Exit" 
    click="NativeApplication.nativeApplication.exit()"/>
<!--/Android-->

Теперь запустите простой пакетный скрипт, который закомментирует весь специфичный для Android код в исходном коде для сборки iOS

PrepareForIos.cmd

@echo off
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "<!--Android-->" "<!-- Android --><!--"
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "<!--/Android-->" "--><!-- /Android -->"
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "<!-- iOS --><!--" "<!--iOS-->"
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "--><!-- /iOS -->" "<!--/iOS-->"
pause

FART - инструмент командной строки для поиска и замены строк

Теперь наш код выглядит следующим образом и готов к сборке для iOS:

<!--iOS-->
<s:Button id="backBtn" 
    icon="{SHOW_LIST}" 
    click="navigator.popView()"/>
<!--/iOS-->

<!-- Android --><!--
<s:Button id="exitBtn" 
    label="Exit" 
    click="NativeApplication.nativeApplication.exit()"/>
--><!-- /Android -->

Пакетная операция в обратном порядке:

PrepareForAndroid.cmd

@echo off
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "<!--Android-->" "<!-- Android --><!--"
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "<!--/Android-->" "--><!-- /Android -->"
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "<!-- iOS --><!--" "<!--iOS-->"
"C:\Program Files (x86)\bin\fart.exe" -r -w -- H:\Flash\MyProject\src\* "--><!-- /iOS -->" "<!--/iOS-->"
pause
1 голос
/ 21 февраля 2014

Уловка, которую я использую, заключается в создании статического класса, который содержит константы для разных сборок:

package 
{
    public class MyAppConstants
    {
        CONFIG::Debug
            public static const DEBUG:Boolean = true;           
        CONFIG::Release
            public static const DEBUG:Boolean = false;
    }
}

И затем я использую эти константы в своем MXML:

<namespace:component visible="{MyAppConstants.DEBUG}" includeInLayout="{MyAppConstants.DEBUG}"/>

Thisубедитесь, что компонент не добавлен в список отображения и, следовательно, не измерен либо.Если вы используете только атрибут visible, размеры компонента по-прежнему учитываются и поэтому оставляют «пустые» пробелы.

0 голосов
/ 11 сентября 2011

Отредактированный ответ, основанный на этом комментарии:

Извините за медлительность, чтобы вернуться к этой теме.Мое намерение состояло в том, чтобы иметь некоторые элементы интерфейса (кнопки и тому подобное), которые были пропущены в некоторых сборках и включены в другие.Мой текущий обходной путь - просто установить свойство visible компонента на определенную компилятором логическую константу - это грубо, но это работает.Есть мысли о лучшем способе?- Крис Китчинг 20 сентября в 14: 40

Я думаю, что вы могли бы использовать отложенную инициализацию flex, чтобы контролировать, какие компоненты создаются и добавляются в ваш родительский компонент - это может быть немноговопреки идее MXML, но я думаю, что это возможно.

Вот небольшой опыт по ручной инициализации отложенных компонентов (для компонентов spark и mx):
http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7aee.html

Flex3

Если вы используете Flex 3, вы можете переопределить метод createComponentsFromDescriptors() и получить доступ к свойству childDescriptors, чтобы точно определить, какие дочерние компоненты MXML будут созданы.

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

Ссылка на класс для UIComponentDescriptor: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponentDescriptor.html

Flex 4

Во Flex 4 это немного менее понятно - все компоненты MXML будут созданы из их дескрипторов (нет свойства childDescriptors, только экземпляр mxmlContentFactory, который создаст все дочерние элементы).

Два варианта управления отображением компонентов MXML могут быть следующими:

  1. Переопределить метод createDeferredContent() и инициализировать дочерние компоненты с помощью mxmlContentFactor, но удалить элементы из возвращенного массива перед установкой mxmlContent.свойство (которое добавляет их в список отображения).

  2. Реализация компонента шаблона, который точно определяет, какой тип компонентов разрешен в качестве дочерних, и только инициализирует соответствующие дочерние элементы для текущего типа сборки..
    Вот пример создания компонента шаблона следующим образом: Использование IDeferred Экземпляр в компоненте шаблона.

Надеюсь, это даст вам возможность подумать, и, надеюсь, это не слишком сложно:)


Оригинальный ответ:

Короткий ответ: вы не можете использовать условную компиляцию для тегов MXML.Все теги MXML будут скомпилированы в компонент.

Каковы ваши цели в использовании условного MXML?

Пытаетесь ли вы включать / исключать классы на основе свойств компилятора, но при этом сохраняетекраткие объявления MXML?то есть не нужно определять все в actionScript.

Имея немного больше информации, мы могли бы найти приемлемую альтернативу:)

...