Метаданные Flex-компилятора "DefaultProperty" - PullRequest
1 голос
/ 30 марта 2009

Учитывая следующее:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2009/mxml">
    <mx:Panel title="blah">
       <mx:Button />
    </mx:Panel>
</mx:Application>

Можете ли вы сказать мне, где дочерние элементы (например, mx: Button) назначены в родительских элементах (например, mx: Panel) по умолчанию по mxmlc. Вы можете установить тег метаданных компилятора " DefaultProperty ", чтобы указать, где они назначены, но что делает flex, если он не указан.

Например, я обошел источник всех гибких классов, из которых mx: Panel наследуется, и DefaultProperty никогда не упоминается, что заставляет меня задуматься, какое значение по умолчанию для DefaultProperty.

извините за всякую глупость, но я прочитал документы наизнанку.

Ответы [ 2 ]

4 голосов
/ 30 марта 2009

При написании компонентов на основе AS свойство по умолчанию позволяет вам указать свойство, которое вы можете использовать в качестве дочернего тега. Например:

 <MyComp:TextAreaDefaultProp>Hello</MyComp:TextAreaDefaultProp>

Вы могли бы также использовать:

 <MyComp:TextAreaDefaultProp defaultText="Hello" />

Что происходит, если вы не укажете? Вы не получаете значение для этого свойства. Учитывая следующий компонент:

package
{
    // as/myComponents/TextAreaDefaultProp.as
    import mx.controls.TextArea;

    // Define the default property.
    [DefaultProperty("defaultText")]

    public class TextAreaDefaultProp extends TextArea {

        public function TextAreaDefaultProp() 
        {
            super();
        }       

        // Define a setter method to set the text property
        // to the value of the default property.
        public function set defaultText(value:String):void {
            if (value!=null)
            text=value;
        }

        public function get defaultText():String {
            return text;
        }
    }    

}

Запустить этот фрагмент:

 <?xml version="1.0" encoding="utf-8"?>
 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
            layout="absolute" width="535" height="345"
            xmlns:local="*">
 <mx:VBox>
 <local:TextAreaDefaultProp id="a" defaultText="Hello"/>
 <local:TextAreaDefaultProp id="b" > World </local:TextAreaDefaultProp>
 <local:TextAreaDefaultProp id="c" />
 <mx:TextArea id="z"/>
 <mx:Button  click="{z.text = a.defaultText 
                                + ' ' + b.defaultText
                                + ' ' + (c.defaultText.length);}" />

</mx:VBox>
</mx:Application>
1 голос
/ 02 апреля 2009

Компилятор фактически рассматривает дочерние компоненты контейнеров как особый случай. Взгляните на свойство childDescriptors mx.core.Container для объяснения. Когда вы создаете экземпляр компонента Flex в MXML, он создается не сразу. Вместо этого создается «дескриптор», который используется для создания экземпляра компонента в будущем, как это определено свойством контейнера creationPolicy. Если вы добавите аргумент -keep-generated-actionscript (или сокращенную версию -keep) к аргументам компилятора, вы сможете увидеть код AS3, который компилятор генерирует из MXML.

...