Arraycollection не захватывает выброшенное событие? - PullRequest
0 голосов
/ 04 августа 2009

У меня есть коллекция объектов, и каждый объект генерирует событие каждый раз, когда его значение обновляется. Я пытаюсь захватить это событие, добавив прослушиватель в массив arraycollection, который его содержит (см. Основной класс), но он не работает. Честно говоря, я не уверен, что это правильный подход.

Я избегаю использования Collection.CHANGE, потому что это приводит к бесконечной рекурсии, которая в конечном итоге заканчивается переполнением стека. Есть идеи?


[Bindable]
public class NamesVO {      
    public var steveList:ArrayCollection;   // array of SteveVO objects

    public function NamesVO() {
        steveList = new ArrayCollection();
    }       

    public function rename():void {
        for each(var steve:SteveVO in steveList) {  
            steve.rename();
        }           
    }
}   

[Bindable]
public class SteveVO extends EventDispatcher {
    public static const VALUE_CHANGED:String = "VALUE_CHANGED";

    public var code:String;
    public var name:String;
    public var _quantity:Number;

    public function SteveVO() {
        this.code = "";
        this.name = "";
        _quantity = 0;
    }

    public function get quantity():Number {
        return _quantity;   
    }

    public function set quantity(quantity:Number):void {
        _quantity = quantity;
        dispatchEvent(new Event(VALUE_CHANGED));    
    }

    public function rename():void {
        name = code + " - " + _quantity;
    }       
}   

Main class:

names = new NamesVO();
names.steveList.addEventListener(SteveVO.VALUE_CHANGED, function():void {
     names.rename();  // this anon function is not being executed!!
}); 

var steve:SteveVO = new SteveVO();
names.steveList.addItem(steve); 

// names is bound on a datagrid and uses itemeditor for each SteveVO object

1 Ответ

0 голосов
/ 04 августа 2009

Событие VALUE_CHANGED не отправляется коллекцией массива steveList, поэтому слушатель не обнаружит ее. Вы можете инкапсулировать нужные вам функции внутри класса NamesVO, обнаруживая, когда элемент добавляется в коллекцию массивов, и добавляя прослушиватель к новому объекту steveVO, который отправляет то же событие из NamesVO. Тогда просто послушайте это событие в вашем основном классе.

Есть ли причина для изменения всех названий при изменении одного количества. Было бы лучше просто вызвать переименование внутри функции set класса steveVO?

Для реализации изменения:

import flash.events.Event;
import mx.collections.ArrayCollection;
import mx.events.CollectionEvent;
import mx.events.CollectionEventKind;

[Bindable]
public class namesVO 
{                  
    public var steveList:ArrayCollection;   // array of SteveVO objects       
    public function namesVO() 
    {                
        steveList = new ArrayCollection();
        steveList.addEventListener(CollectionEvent.COLLECTION_CHANGE,collChanged);   
    }

    private function collChanged(e:CollectionEvent):void
    {
        if (e.kind == CollectionEventKind.ADD)
        e.items[0].addEventListener(steveVO.VALUE_CHANGED,valueChanged);
    }                      

    private function valueChanged(e:Event):void
    {
        dispatchEvent(new Event(steveVO.VALUE_CHANGED));
    }

    public function rename():void 
    {                
        for each(var steve:steveVO in steveList) 
        {                              
            steve.rename();                
        }  
    }                             
}

В основном классе использовать:

names = new namesVO();
names.addEventListener(steveVO.VALUE_CHANGED, function():void 
{     
    names.rename();  
}); 

steve = new steveVO();
names.steveList.addItem(steve); 
steve.quantity = 12;

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

...