Как я могу получить доступ к компоненту вв классе MXML? - PullRequest
1 голос
/ 20 декабря 2011

Можно ли получить доступ к объявленному компоненту как IFactory в классе MXML? Я использовал этот стиль объявления фабрик много раз для Skin Parts, но я никогда не понимал, как получить доступ к этим фабрикам из MXML.

Вот пример того, что я ожидал бы работать:

<fx:Declarations>
    <fx:Component id="labelDisplay">
        <s:Label fontSize="12" fontWeight="bold"/>
    </fx:Component>
</fx:Declarations>

<fx:Script>
    <![CDATA[
        override protected function createChildren():void
        {
            super.createChildren();

            var label1:Label = labelDisplay.newInstance();
            addElement(label1);

            var label2:Label = labelDisplay.newInstance();
            addElement(label2);

            var label3:Label = labelDisplay.newInstance();
            addElement(label3);
        }
    ]]>
</fx:Script>

* редактировать *

Причина, по которой я надеялся, что приведенный выше код сработает, основана на том, как обрабатываются динамические части скина в архитектуре скинов Spark. Если приведенный выше код является частью класса обложки MXML, то в моем хост-компоненте я мог бы иметь следующее.

[SkinPart(required="true",type="spark.controls.Label")]
public var labelDisplay:IFactory;

В архитектуре скинов Spark, в какой момент превращается в IFactory?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Я покопался в SkinnableComponent Flex, чтобы найти решение, основанное на том, как они связывают обложку MXML с AS HostComponent.По-видимому, даже если «labelDisplay» не отображается в автозаполнении FlashBuilder как конкретный элемент класса, вы все равно можете ссылаться на него как на динамическое свойство.Я изменил свой оригинальный пример здесь:

<fx:Declarations>
    <fx:Component id="labelDisplay">
        <s:Label fontSize="12" fontWeight="bold"/>
    </fx:Component>
</fx:Declarations>

<fx:Script>
    <![CDATA[
        override protected function createChildren():void
        {
            super.createChildren();

            var labelFactory:ClassFactory = this["labelDisplay"];

            var label1:Label = labelFactory.newInstance();
            addElement(label1);

            var label2:Label = labelFactory.newInstance();
            addElement(label2);

            var label3:Label = labelFactory.newInstance();
            addElement(label3);
        }
    ]]>
</fx:Script>
0 голосов
/ 20 декабря 2011

Я вижу проблему в том, что вы не создали iFactory, поэтому не сможете получить доступ к методам iFactory.

Я бы порекомендовал вам зайти в ActionScript и даже создать iFactory, если он вам нужен. При этом используется ClassFactory class

protected var labelDisplay: iFactory = new ClassFactory(spark.controls.Label);

Тогда ваш код createChildren должен работать как есть.

...