Каков синтаксис MXML для назначения свойств подкомпонентов в пользовательских компонентах MXML? - PullRequest
0 голосов
/ 04 июня 2011

Я работаю над пользовательским компонентом 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 Ответ

1 голос
/ 05 июня 2011

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

Я укажу, что color на метке и fontStyle на TextInput не являются свойствами. Это стили Итак, код у вас есть:

myInput.cLabel.color = "0xffffff";

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

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.

...