Оболочка ArrayCollection, позволяющая механизму связывания видеть изменения - PullRequest
0 голосов
/ 26 июля 2011

У меня есть ArrayCollection, содержащая привязываемые объекты.Я хотел бы получить доступ к ним в нескольких местах, как показано ниже (для ясности есть только один ярлык).Как я могу этого достичь?Должен ли я написать какую-нибудь оболочку для ArrayCollection, отправляющую специальное событие (которое?), Которое можно перехватить механизмом событий Flex.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
                 creationComplete="init()">


    <mx:VBox>
        <s:Label id="lb" text="{lab(col)}" />
        <s:Button click="onC(event)" color="0x000000"/>     
    </mx:VBox>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.CollectionEvent;
            import mx.events.PropertyChangeEvent;

            import spark.events.ListEvent;

            [Bindable] private var col:ArrayCollection;

            private function init():void {
                col = new ArrayCollection();
                col.addItem({ val: 1 });
                col.addItem({ val: -1 });
            }

            private function onC(event:MouseEvent):void {
                col.getItemAt(0).val++;

                trace(col.getItemAt(0).val);
            }

            private function lab(_:ArrayCollection):String {
                for(var i:int = 0; i < col.length; i++) {
                    if(col.getItemAt(i).val > 0)
                        return col.getItemAt(i).val.toString();
                }

                return "-666";
            }

        ]]>
    </fx:Script>
</s:Application>

Я хотел бы создать оболочку следующим образом:что механизм связывания будет работать.Что я должен поставить вместо "...."?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Ваша проблема в том, что метка не показывает значение, которое есть в вашей коллекции ArrayCollection, я прав? Это так, потому что Label не имеет механизма обновления для ArrayCollection, как DataGrid или List.
Ваша ArrayCollection является привязываемой, но это только означает, что ваша функция lab(col) будет выполняться только при изменении значения переменной col.
Вы устанавливаете col = new ArrayCollection();, и в этот момент привязка выполняется. И только после этого вы добавляете ценности в свою коллекцию. Есть 2 способа решения этой проблемы:

  1. Позвоните lb.executeBindings(), чтобы обновить вид метки.
  2. Прослушайте CollectionEvent.COLLECTION_CHANGE эту рассылку ArrayCollection, когда ее элементы изменены.

Надеюсь, это поможет вам.

0 голосов
/ 26 июля 2011

Похоже, вы начинаете. Единственное, что я вижу здесь, - это ArrayCollection, а не объекты в нем. Если вы хотите, чтобы коллекция (или любые данные в целом) была доступна в любом месте вашего приложения, эти клиентские фрагменты кода должны знать, как к ней добраться. Один из возможных подходов - реализовать шаблон проектирования Singleton - http://www.squidoo.com/flash-tutorials_as3-singleton-design-pattern. Это было бы хорошей отправной точкой для того, чтобы ваши данные стали более "глобальными".

...