2011-07-26 1 views
0

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

<?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> 

Я хотел бы создать обертку, как это:

 public class BindableArrayCollection extends EventDispatcher { 

    [Bindable] private var _ac:ArrayCollection; 

    public function BindableArrayCollection() { 
     this.ac = new ArrayCollection(); 
    } 


    [Bindable] 
    public function set ac(val:ArrayCollection):void { 
     if(_ac != null) 
      _ac.removeEventListener(CollectionEvent.COLLECTION_CHANGE, toggleChangeEvent); 

     _ac = val; 

     if(_ac != null) 
      _ac.addEventListener(CollectionEvent.COLLECTION_CHANGE, toggleChangeEvent); 

     toggleChangeEvent(); 
    } 

    public function get ac():ArrayCollection { 
     return _ac; 
    } 

    public function toggleChangeEvent(_:Object = null):void { 
     dispatchEvent(....); 
    } 
} 

так, что механизм связывания будет работать. Что я должен разместить вместо «....»?

ответ

0

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

+0

На самом деле это может быть лучше пройти через ... http://www.swinburne.edu.au/design/tutorials/P-flash/T-How-to-build-a-Singleton-in-Actionscript- 3/ID-143/ –

+0

Спасибо, но это не главное. Я знаю, что изменения в элементах внутри ArrayCollection не видны механизмом привязки. Я просто спрашиваю, как заставить его работать. Есть ситуация, когда у меня есть ArrayCollection с большим количеством элементов. Я хочу показать некоторые из них в меток, используя метод поиска, например. . Свойство «значение» обновляется каждую секунду, и я бы хотел, чтобы он отображался на экране. –

1

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

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

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

+0

Я попытался использовать «executeBindings (true)» для обновления нескольких ярлыков внутри VGroup, но он не работает :( –

+0

@just_me, этот логический параметр по некоторым причинам вообще не используется в реализации метода, поэтому вам нужно применить executeBindings напрямую на каждую метку. –

Смежные вопросы