Каков синтаксис MXML для назначения свойств подкомпонентов в пользовательских компонентах MXML?

#apache-flex #syntax #mxml

#apache-flex #синтаксис #mxml

Вопрос:

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

Игрушечный компонент, который объединяет как метку, так и ввод текста:

 <?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" 
     >  
<fx:Script>
    <![CDATA[
        [Bindable] public var prompt:String = "default prompt";
        [Bindable] public var input:String = "default inpput";
    ]]>
</fx:Script>
<s:VGroup>
    <s:Label id="cLabel" text="{prompt}" />
    <s:TextInput id="cTextInput" text="{input}" />
</s:VGroup>
</s:Group>
  

Затем в моем основном приложении я хотел бы получить доступ к общедоступным интерфейсам подкомпонента через mxml без перезаписи сквозной привязки для каждого из них. Что-то вроде:

 ...
<local:myInput prompt="name" input="please enter name">
    <local:cLabel color="0xffffff" />
    <local:CTextInput fontStyle="bold" />
</local:myInput>
  

В actionscript это можно легко сделать для всех общедоступных свойств:

 myInput.cLabel.color = "0xffffff";
  

Но я в тупике с синтаксисом MXML. Кажется, что это должно быть легко, но я пока не нашел ответа. Любая помощь приветствуется.

Ответ №1:

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

Я отмечу, что цвет на ярлыке и стиль шрифта на TextInput не являются свойствами. Это стили, поэтому код, который у вас есть:

 myInput.cLabel.color = "0xffffff";
  

Скорее всего, выдаст ошибку, потому что color не является свойством. Вам пришлось бы использовать код, подобный этому:

 myInput.cLabel.setStyle('color',"0xffffff");
  

Однако, поскольку стили обычно наследуются дочерними элементами; я подозреваю, что в компоненте верхнего уровня вы можете установить стиль, и он сразу же автоматически перейдет к дочерним элементам. Итак, вы должны просто уметь делать:

 myInput.setStyle('color',"0xffffff");
  

Или в MXML:

 <local:myInput prompt="name" input="please enter name" color="0xffffff" fontStyle="bold"  >
</local:myInput>
  

И она должна стекать вниз. Все может стать сложнее, если вы хотите задать стили индивидуально для дочерних компонентов.

Но вернемся к вашему первоначальному вопросу, касающемуся свойств. Чтобы сохранить компонент инкапсулированным, вы должны создать свойства, которые устанавливаются для дочерних элементов. Что — то вроде этого:

 private var _property : String;
public function get property():String{
 return _property;
}
public function set property(value:String){
 _property = value;
 myChildComp.property = value;
}
  

Это может быть отстойно, если вам нужно сделать это для большого количества свойств. Если инкапсуляция этого компонента не является приоритетом; просто задайте их в ActionScript.

Комментарии:

1. Спасибо за разъяснение по значениям стиля, я должен был использовать лучший пример, который зависел от свойств. IMO написание геттеров и установщиков для каждого интерфейса агрегированного класса приводит к более тесной связи, чем если бы можно было просто составлять ортогональные классы вместе. Я думаю, мне просто нужно привыкнуть к написанию большого количества boiler plate, если я хочу составлять компоненты вместе. Может быть, другим вариантом было бы создать класс шаблона MXML и передать все компоненты в качестве аргументов? Что-то вроде класса Flex Form?