Arraycollection没有捕获抛出的事件?

时间:2009-08-04 17:44:44

标签: flex actionscript-3 events listener dispatcher

我有一个对象集合,每个对象在每次更新其值时都会抛出一个事件。我试图通过向持有它的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 :(得分:0)

steveList数组Collection不会调度VALUE_CHANGED事件,因此侦听器不会检测到该事件。您可以通过检测项目何时添加到数组集合并将侦听器添加到从NamesVO调度相同事件的新steveVO对象来封装您想要在NamesVO类中的功能。 。然后在主课堂上听一下这个事件。

当更改一个数量时,是否有理由更改所有名称。简单地在steveVO类的set函数内调用rename会更好吗?

实施更改:

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;

当然这只是一个例子,仅包括一次添加一个项目的情况。