Spark.Components.List с переменным содержимым: Flex 4, AS3

Я написал следующее во Flex 4/AS3, и это не сработало так, как ожидалось.

Итак, я хотел бы знать, если что-то не так с моим кодом... Я объясню это:

TileTest.mxml

<s:Application minWidth="955" minHeight="600" creationComplete="createButtons()"
<fx:Script>
    <![CDATA[
        import Object.TestButton;
        import mx.collections.ArrayList;

        private var _names:Array = ["one", "two", "three"]; 

        public function createButtons():void
        {
            var buttons:ArrayList = new ArrayList();

            for(var a:int = 0; a < _names.length; a++)
            {
                var testButton:TestButton = new TestButton();
                    testButton.customName = _names[a];

                buttons.addItem(testButton);
            }

            myList.dataProvider = buttons;
        }
    ]]>
</fx:Script>
<s:VGroup gap="12" width="100%">
    <s:Label text="Options" fontSize="18" fontWeight="bold" color="#333333" />
    <s:List width="100%" height="100%" id="myList" itemRenderer="Object.TestButton" borderVisible="false">
        <s:layout>
            <s:TileLayout orientation="rows" columnWidth="290" rowHeight="90" columnAlign="left" horizontalGap="0" verticalGap="0" />
        </s:layout>
    </s:List>
</s:VGroup>
</s:Application>

Это мое заявление. Здесь у меня есть список myList, в который я загружаю несколько TestButton. Я установил имя для каждой кнопки внутри цикла.

TestButton

<s:Group width="300" height="90" click="{ Alert.show(_name); }"
<fx:Script>
    <![CDATA[
        import mx.controls.Alert;

        private var _name:String = "just a test...";

        public function set customName(newName:String):void
        {
            _name = newName;

            Alert.show(_name);

            this.addEventListener(MouseEvent.MOUSE_OVER, function():void{ Alert.show(_name); });
        }
    ]]>
</fx:Script>
<s:BorderContainer accentColor="#000000" width="100%" height="100%" />
</s:Group>

Как видите, у меня есть три оповещения в этом компоненте... Я сделал так, чтобы мы могли понять проблему.

  • Первое предупреждение возникает, когда я задаю customName, которое происходит в приложении, как уже показано.

  • Второй должен произойти в Mouse_Over, так как прослушиватель событий был добавлен в элемент Group.

  • И третье предупреждение должно появиться при щелчке в элементе группы.

Теперь, если я запускаю полученный SWF, я вижу все три кнопки на экране и три оповещения, по одному для каждого набора customName в Приложении, и оно предупреждает правильное имя.

Если я наведу мышку на любую кнопку, она не предупредит ни одного сообщения.

Если я нажимаю любую кнопку, она предупреждает сообщение по умолчанию со свойством _name, которое является "просто тестом..."

Я не могу понять, в чем проблема, так как я ожидал, что она всегда предупредит имя, установленное Приложением для каждой кнопки. Кроме того, я не хочу менять компоненты... я хочу сказать, что я хотел бы иметь List и TestButtons с частной строкой внутри.

Если проблема в этих конкретных реализациях, то у меня не будет другого пути, кроме как изменить его...

Спасибо вам всем!

1 ответ

Решение

Проблема в том, что у вас есть список TestButtonв вашем поставщике данных, а не просто данные. Эти кнопки создаются, и поэтому вы видите правильные оповещения.

Итак, Flex видит список из трех элементов и, следовательно, создает три дополнительных TestButtons представить данные в вашем списке. Но те TestButtons являются совершенно новыми, со значениями по умолчанию для его свойств.

Чтобы это исправить, было бы лучше, если бы у вас были данные только в вашем поставщике данных ArrayList, и вы могли бы получить к ним доступ через data собственность вашего элемента рендерера.

Другие вопросы по тегам